XmlException with XmlStringReader vb .net

时间:2012-07-26 12:06:29

标签: .net xml vb.net xml-parsing

我正在尝试使用XmlStringReader解析错误的XML代码,就像这样。

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

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

        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

  

'标题'是一个意外的标记。预期的标记是'='

有没有办法避免这种异常?或者我应该在此之前解析xml以修复错误写入的属性吗?

由于

2 个答案:

答案 0 :(得分:3)

  

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

这不是XML。它看起来像XML一样 bit ,但事实并非如此。不要尝试使用XML API读取非XML。它会 - 而且应该 - 失败。

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

答案 1 :(得分:0)

解析器的通用规则是它们根据编写解析器的规范假设输入有效。对于XML解析器,它假定您将有效的XML代码传递给解析。

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

你不能只是“修复”异常。解析器完全混淆了,它正在放弃。即使你能以某种方式迫使它继续下去,也无法保证结果的有效性。这就像是有人通过一本书并删除了所有的标点符号。你可能会因为无法理解而沮丧地放下它。但是如果有人强迫你无论如何都要阅读它,你可能最终会得到错误的意思。解决问题的唯一方法是给它理解的解析器输入。

所以,是的,在通过解析器运行之前,您需要确保XML是有效的。你从哪里获得这个XML?你能修复生成过程,以便它使用有效的标识符并正确地符合XML模式吗?