2017-04-06 7 views
1

Wie lautet die Liste der ungültigen Unicode-Zeichen in XML-Attributen (Tags)?Ungültiges Unicode-Zeichen in XML-Attribut/Tag

Als folgenden python3 Code zeigt:

import xml.etree.ElementTree as ET 
from io import StringIO as sio 

xml_dec = '<?xml version="1.1" encoding="UTF-8"?>' 
unicode_text = '<root>textº</root>' 
valid_unicode = '<标签 属性="值">文字</标签>' 
invalid_unicode_attribute = '<tag attributeº="value">text</tag>' 
invalid_unicode_tag = '<tagº>text</tagº>' 

ET.parse(sio(xml_dec + unicode_text)) 
# works 

ET.parse(sio(xml_dec + valid_unicode)) 
# works 

ET.parse(sio(xml_dec + invalid_unicode_attribute)) 
# ParseError 

ET.parse(sio(xml_dec + invalid_unicode_tag)) 
# ParseError 

das Unicode-Zeichen º, d.h. U+00BA kann analysiert werden, wenn es in das Element Text ist, aber nicht in Elementattribut oder Tag. Auf der anderen Seite können andere Unicode-Zeichen, wie beispielsweise chinesische Zeichen, in Elementattributen und Tags analysiert werden.

überprüfte ich die xml <?xml version="1.1" encoding="UTF-8"?><tagº>text</tagº> in https://validator.w3.org/check, und es gibt den Fehler:

Line 1, Column 43: character "º" not allowed in attribute specification list

jedoch in XML Recommendation 1.1, §2.2 Characters, sie sagt, es ist erlaubt:

Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

Meine Frage ist, wo kann ich finde die Liste der ungültigen Unicode-Zeichen in XML-Attributen/Tags?

+0

Ist das jetzt über Attribute oder Tag-Namen? Der Titel und der letzte Satz sprechen über Attribute, aber die Beispiele betreffen nur Text und Tags. – lenz

+2

In jedem Fall müssen Sie nur ein wenig in dem Dokument blättern, das Sie selbst verlinkt haben. Zum Beispiel ist [hier] (https://www.w3.org/TR/xml11/#NT-NameStartChar) die Definition, welche Zeichen Sie in einem Tag-Namen verwenden dürfen. – lenz

Antwort

2

Für in-Tag erlaubten Zeichen und Attributnamen, die W3C recommendation (zu denen sie verknüpft sich - aber Sie wurden bei der Definition suchen, was in einem Textknoten verwendet werden) besagt Folgendes:

Almost all characters are permitted in names, except those which either are or reasonably could be used as delimiters.

und

Document authors are encouraged to use names which are meaningful words or combinations of words in natural languages, and to avoid symbolic or white space characters in names. Note that COLON, HYPHEN-MINUS, FULL STOP (period), LOW LINE (underscore), and MIDDLE DOT are explicitly permitted.

The ASCII symbols and punctuation marks, along with a fairly large group of Unicode symbol characters, are excluded from names because they are more useful as delimiters in contexts where XML names are used outside XML documents; providing this group gives those contexts hard guarantees about what cannot be part of an XML name.

Dies wird durch eine formal definition gefolgt, die eine Menge von Unicode listet Bereiche:

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | 
        [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | 
        [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | 
        [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | 
        [#x10000-#xEFFFF] 
NameChar  ::= NameStartChar | "-" | "." | [0-9] | #xB7 | 
        [#x0300-#x036F] | [#x203F-#x2040] 
Name   ::= NameStartChar (NameChar)* 

Der männliche Ordinalindikatorº (#xBA) ist nicht unter ihnen, aus irgendeinem Grund (zumindest verwenden einige Sprachen es in Abkürzungen für allgemeine Wörter, so dass es nicht wie ein "Trennzeichen" für mich aussieht).

Es ist auch interessant zu sehen, dass Sie Ziffern, Bindestriche und Punkte in Tag-Namen verwenden können, aber nicht als das erste Zeichen.