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把缺少左尖括号的子元素当做文本的可能。
但是如果元素本身设计成可能包含文本,那就真的没辙了!
- XML 中的左尖括号
- java转义xml中的多余尖括号
- out.println时对左尖括号和右尖括号的转义
- PHP中 三左尖括号的用法, $var=<<<
- Struts2 在xml文件中敲尖括号”<”没有提示【7】
- xml CDATA尖括号被转义后处理办法
- SQL 中的尖括号">"自动转成>,SQL递归简单写法
- CSS选择器中的空格与尖括号有何区别?
- oracle 中的左连接
- Ext grid中单元格会自动处理Xml格式问题,对尖括号的转义
- 使用xml模板导出excel时遇到尖括号<>转义的问题解决
- 关于linq中的左连接
- Java 中的左移运算
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- 【轻松前端之旅】CSS选择器中的空格与尖括号有何区别?
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- eclipse ctrl+左键进入xml文件
- 李开复、洪小文、黄学东关系
- 1583个mms电台列表
- 梧桐山--百年古道
- SBJsonWrite int sqlite3
- ASP.NET MVC 3 CheckBoxList 的使用
- XML 中的左尖括号
- Linux启动过程
- 以前写的一个XML文件的助手类,现在看起来觉得有的地方不好而难用,不过我觉得还是有些启发吧(C#,XML)
- linux下重载new,new失败仍然会进入构造函数
- 5种流行的Linux发行版:你更喜欢哪一个呢?
- 一个计算机爱好者的不完整回忆(十二)下载软件
- CentOS系统下安装vsftpd
- EBS的Jar文件
- Java中以指定编码方式读取字符流