必须XML结束标记名称与XML结束标记名称完全匹配吗?

必须XML结束标记名称与XML结束标记名称完全匹配吗?

问题描述:

我有下面的XML(试验例):必须XML结束标记名称与XML结束标记名称完全匹配吗?

<?xml version="1.0" encoding="UTF-8"?><?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" > 
<Styles> 
<Style ss:ID="s21"><NumberFormat ss:Format="@"/></Style> 
</Styles> 
<Worksheet ss:Name="--"> 
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1" x:FullRows="1" ss:StyleID="s21"> 
    <Column ss:StyleID="s21" ss:Width="184"/> 
    <Row> 
     <Cell><ss:Data ss:Type="String">42</Data></Cell> 
</Row></Table></Worksheet></Workbook> 

当试图读取使用DataSet.ReadXml()文件,会生成以下异常:The 'ss:Data' start tag on line 12 position 14 does not match the end tag of 'Data'. Line 12, position 43.
虽然在W3C的文档显示名称空间限定的结束标记所有的例子, MS Excel打开这样的文件没有任何警告。

设置DataSet.Namespace = "ss";不会改变任何东西。

可以做些什么来读取这样的文件,最好不添加额外的库?

+0

应该是: – jdweng

+0

@jdweng是,似乎完美的XML不应该是这样的。我的问题是:鉴于这个XML,没有任何改变它的*,我应该如何解析它?将“”和“”的所有实例替换为“”和“”的所有实例都可能工作,但我想知道是否有“更简单”的方法。 – Abstraction

+0

@Abstraction:这不仅仅是“完美”的XML,它不应该是这样的。 *任何* XML *都不能这样,否则它不是XML。 – kjhughes

是的,XML结束标记必须完全匹配XML开始标记,包括任何名称空间前缀。

从你的问题:

可以做些什么来读取这样的文件,最好不增加额外 库?

如果要使用兼容的XML工具成功解析XML,则必须将其修复为良构。特别是,你必须更改结束标记为@jdweng suggests in the comments</ss:Data>

W3C XML Recommendation, section 3.1

[定义:所有以起始标签 开始元素的结尾必须用一个标记结束标签含有呼应作为起始标签中给出的 元素类型的名称:]

从你的问题:

尽管W3C文档中的所有示例都显示命名空间限定的末尾 标记,但MS Excel将打开此文件时不会出现任何警告。

然后MS Excel没有以符合的方式处理XML,并且很可能会丢失其他问题。

又见How to parse invalid (bad/not well-formed) XML?

+0

谢谢。主要是我担心我错过了'XmlReadMode'的值,而文件实际上是一个格式良好的XML。现在我显然不得不使用选项3.你的答案的链接问题。是否有直接引用,开始和结束标签必须既有前缀又有前缀? W3C的页面 - https://www.w3.org/TR/REC-xml-names/ - 给人的印象是可以扩展'STag ETag'到''''QName(S Attribute)* S?'>'''QName S? '>''然后进入'''PrefixedName'>'UnprefixedName'>''。 – Abstraction

+0

答案已更新,以显示XML建议书中的位置,它表示结束标记名称必须与开始标记名称匹配。 – kjhughes