2

我有许多需要解析的长文档。文档格式类似于 XML,但实际上不是 xml。

这是一个例子:

<DOC>
    <TEXT>it's the content P&G</TEXT>
</DOC> 
<DOC>
    <TEXT>it's antoher</TEXT>
</DOC>

请注意,有多个根标签 - <DOC>,并且实体&应该&amp;在 xml 中。

因此,上述文件不是标准的 xml。

我可以使用XmlDocument来解析文件,还是应该编写自己的解析器?

4

3 回答 3

6

您所说的有些不正确-这是“不是标准的XML”。该文档不是XML。时期。

不能使用XmlDocument或任何其他 XML 解析器将其解析为完整的文档。

在尝试使用 XML 解析器对其进行解析之前,您需要确保您拥有有效的 XML。

所以 - 在这种情况下,要么将文档扭曲到根元素中,要么将其分解为多个文档。在任何一种情况下,您都需要确保对特殊字符进行正确编码(引号、和号等...)。

Oakio的答案通过将文档视为 XML 片段来让您分道扬镳,但这仍然无助于无效内容,例如未转义的 & 符号。

于 2013-07-19T09:38:09.490 回答
2

正如@Oded 所说,这不是 XML 文档——只是一些文本。

但是,通过一些预解析,您可能可以将其转换:

将整个东西包装在一个新的根节点中:

<DOCS>
    <DOC>
        <TEXT>it's the content P&G</TEXT>
    </DOC> 
    <DOC>
        <TEXT>it's antoher</TEXT>
    </DOC>
<DOCS>

并搜索不允许的字符并替换为它们的实体(例如&apos;&amp;)。

正如评论中指出的那样,您应该&首先替换以避免双重编码(即以 结尾&apos;amp;

不过,您可能必须通过字符串操作来执行此操作,具体取决于您从何处获取数据。

于 2013-07-19T09:41:45.060 回答
1

是的,但你应该设置XmlReaderSettings.ConformanceLevel

XmlReaderSettings settings = new XmlReaderSettings()
{
    ConformanceLevel = ConformanceLevel.Fragment
};
using (XmlReader reader = XmlReader.Create(stream, settings))
{
    //TODO: read here
}

更多:http: //msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.conformancelevel.aspx

于 2013-07-19T09:39:23.243 回答