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

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

选项似乎包括:

  • 扩展DOM并使用IXmlLineInfo
  • 使用XPathDocument

我所知道的唯一其他选项是XDocument.Load() ,其重载接受LoadOptions.SetLineInfo 。 这将以与XmlDocument非常相同的方式使用。

(扩大@Andy评论的回答)

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

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

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

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

 using (var reader = new XmlTextReader(filename)) { var doc = new PositionXmlDocument(); doc.Load(reader); } 

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

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