我正在尝试使用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以修复错误写入的属性吗?
由于
答案 0 :(得分:3)
我应该在此之前解析xml来修复错误写入的属性吗?
这不是XML。它看起来像XML一样 bit ,但事实并非如此。不要尝试使用XML API读取非XML。它会 - 而且应该 - 失败。
理想情况下,修复生成伪XML的内容。
答案 1 :(得分:0)
解析器的通用规则是它们根据编写解析器的规范假设输入有效。对于XML解析器,它假定您将有效的XML代码传递给解析。
在这种情况下,您不是因为XML不允许属性在其名称中包含空格。 page Caption
不是有效的属性标识符,因此解析器可能将page
解释为属性标识符,将空格视为分隔符,并想知道如何处理Caption
。
你不能只是“修复”异常。解析器完全混淆了,它正在放弃。即使你能以某种方式迫使它继续下去,也无法保证结果的有效性。这就像是有人通过一本书并删除了所有的标点符号。你可能会因为无法理解而沮丧地放下它。但是如果有人强迫你无论如何都要阅读它,你可能最终会得到错误的意思。解决问题的唯一方法是给它理解的解析器输入。
所以,是的,在通过解析器运行之前,您需要确保XML是有效的。你从哪里获得这个XML?你能修复生成过程,以便它使用有效的标识符并正确地符合XML模式吗?