0

我正在尝试使用 XmlStringReader 解析错误的 XML 代码,例如这个。

<Page CODE=""L"" page Caption=""Example""><Cell CellType="0"...></Cell></Page>

并使用此代码,我尝试从单元格标记中的单元格类型属性中获取值。

        Using reader As XmlReader = XmlTextReader.Create(New StringReader(l.Label), New XmlReaderSettings With {
                                                     .ValidationType = ValidationType.None,
                                                     .XmlResolver = Nothing})
               While (reader.ReadToFollowing("Cell"))
            reader.MoveToAttribute("CellType")
            Select Case Int32.Parse(reader.Value)
                  ...
            End Select
        End While

所以我得到以下 XmlException

'Caption' 是一个意想不到的标记。预期的标记是'='

有什么方法可以避免这种异常吗?还是我应该在此之前解析 xml 以修复错误写入的属性?

谢谢

4

2 回答 2

3

我应该在此之前解析 xml 以修复错误写入的属性吗?

它不是 XML。它看起来有点像 XML,但实际上并非如此。不要尝试使用 XML API 读取非 XML。它会——而且应该——失败。

理想情况下,首先修复生成伪 XML 的任何内容。

于 2012-07-26T12:10:15.043 回答
0

解析器的通用规则是它们假设输入根据解析器编写的任何规范都是有效的。那么,在 XML 解析器的情况下,它假定您正在向它传递有效的 XML 代码以进行解析。

在这种情况下,您不是因为 XML 不允许属性在其名称中包含空格。page Caption不是有效的属性标识符,因此解析器可能将其解释page为属性标识符,将空格视为分隔符,并想知道如何处理Caption.

你不能只是“修复”异常。解析器彻底糊涂了,它正在放弃。即使您可以以某种方式强制它继续,也无法保证结果的有效性。就像有人浏览一本书并删除了所有标点符号一样。你可能会沮丧地放下它,因为你无法理解它。但是,如果有人强迫您阅读它,您最终可能会更频繁地得到错误的含义。解决问题的唯一方法是向解析器提供它理解的输入。

So, yes, you'll need to ensure that the XML is valid before running it through a parser. Where are you obtaining this XML from? Can you fix the generation process so that it uses valid identifiers and conforms properly to an XML schema?

于 2012-07-26T12:14:56.473 回答