XML 中的左尖括号

来源:互联网 发布:人工智能论文1000字 编辑:程序博客网 时间:2024/04/30 06:45

最近遇到了一个很棘手的问题,找了好久都没找到原因,后来终于找到了却令人迷惑。一个在我看来应该是XML语法错误的XML配置文件却能够通过XML schema 的校验。这个有语法错误的XML 配置文件最终导致了整个程序的错误。这个文件的片段如下:

<snapmetric name="vendor" type="string">     aggregate type="none" groupBy="true"/></snapmetric>

一眼就能看到第二行其实是一个element,在"aggregate"之前应该还有一个“<”。 很明显的一个疏忽引起的XML格式错误,但是这样一个文件在进行XML schema 校验时却通过了,这是怎么回事,难道说schema校验并不关注XML本身的格式是否正确吗?

带着这样的疑问我将该XML做了修改:

<snapmetric name="vendor" type="string">     <aggregate type="none" groupBy="true"</snapmetric>
补上了左括号但是去掉了右括号,这次却令人意外的报错,说是格式错误。 这是怎么回事呢?

最终在XML文档中找到了答案:

The ampersand character (&) and the left angle bracket (< may appear in their literal form only when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped ...

就是说在XML文件中,用户定义的value中“&”和“<”是绝对不允许的,那就是说">"其实是允许的,看看第一个XML片段,缺少了“<”, 

"aggregate type="none" groupBy="true"/>" 其实是被XML 当成了“snapmetric” 这个元素中的文本内容而不是子元素。这就解释了为什么这个XML没有被校验出个事错误的原因。那如何让XML 不把“aggregate type="none" groupBy="true"/>“当成文本呢? 有一个办法,哈哈。
看看我的schema定义:

<xs:element name="snapmetric">
<xs:complexType mixed="false">
<xs:all>
<xs:element ref="aggregate" minOccurs="0" maxOccurs="1"/>
<xs:element ref="alert" minOccurs="0" maxOccurs="1"/>
</xs:all>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="float"/>
<xs:enumeration value="integer"/>
<xs:enumeration value="string"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="name" type="xs:string" use="required">
</xs:attribute>
</xs:complexType>
</xs:element>

看到红色字体的”mixed="false"“了吗,它表示这个元素只包含子元素,不会包含文本,这就限制了XML把缺少左尖括号的子元素当做文本的可能。
但是如果元素本身设计成可能包含文本,那就真的没辙了!


原创粉丝点击