C#:使用XmlDocument解析XML时的行信息

Nic*_*eld 7 c# xml xmldocument

使用XmlDocument解析XML文件有什么选择,并且以后仍然保留错误消息的行信息?(顺便说一句,是否可以使用XML Deserialisation做同样的事情?)

选项似乎包括:

dah*_*byk 8

我所知道的唯一其他选择是XDocument.Load(),其超载接受LoadOptions.SetLineInfo.这将以与a相同的方式消耗XmlDocument.


Ser*_*y K 5

(从@Andy的评论中扩大答案)

没有内置的方法来使用XmlDocument(如果你正在使用XDocument,你可以使用XDocument.Load()接受的重载LoadOptions.SetLineInfo- 请参阅此问题).

虽然没有内置方法,但您可以使用PositionXmlDocument此处的包装类(来自SharpDevelop项目):

https://github.com/icsharpcode/WpfDesigner/blob/5a994b0ff55b9e8f5c41c4573a4e970406ed2fcd/WpfDesign.XamlDom/Project/PositionXmlDocument.cs

为了使用它,你需要使用Load接受的重载XmlReader(其他Load重载将转到常规XmlDocument类,它不会给你行号信息).如果您当前正在使用XmlDocument.Load接受文件名的重载,则需要更改代码,如下所示:

using (var reader = new XmlTextReader(filename))
{
    var doc = new PositionXmlDocument();
    doc.Load(reader);
}
Run Code Online (Sandbox Code Playgroud)

现在,您应该能够XmlNode将此文档中的任何内容转换为a PositionXmlElement来检索行号和列:

var node = doc.ChildNodes[1];
var elem = (PositionXmlElement) node;
Console.WriteLine("Line: {0}, Position: {1}", elem.LineNumber, elem.LinePosition);
Run Code Online (Sandbox Code Playgroud)