如何从一个 XmlElement 或 XPathNavigator 中获取行号

3
我试图从一个XmlNode(也就是一个XmlElement)获取行号,但它不能转换为IXmlLineInfo。所以我尝试使用XPathNavigator,但它也不起作用。
如何获取它的行号?

我相当确信你的强制类型转换中有错别字,比如缺少括号。但是没有代码只是猜测。 - Kilazur
1个回答

7

使用XPathNavigator和XPathDocument对我来说效果很好,以下是代码片段:

    XPathDocument doc = new XPathDocument("XMLFile1.xml");
    foreach (XPathNavigator element in doc.CreateNavigator().Select("//*"))
    {
        Console.WriteLine("Element {0} at line {1}.", element.Name, (IXmlLineInfo)element != null ? ((IXmlLineInfo)element).LineNumber : 0);
    }

对于该文件

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <foo>3</foo>
  <foo>4</foo>
</root> 

输出

Element root at line 2.
Element foo at line 3.
Element foo at line 4.

我认为如果你想使用XmlDocument来操作XML文档,你需要扩展DOM实现。如今在.NET世界中,如果你想操作XML文档,我建议使用XDocument/XElement,你可以设置加载选项以确保获得IXmlLineInfo,参见http://msdn.microsoft.com/en-us/library/bb538371%28v=vs.110%29.aspxhttp://msdn.microsoft.com/en-us/library/system.xml.linq.loadoptions%28v=vs.110%29.aspx


无法测试,但是对我来说看起来很好。 - Kilazur
我不知道为什么它对我不起作用,但是我改变了读取文档的方式,使用XDocument代替XmlDocument,现在它可以正常工作了!谢谢! - SeyoS
在我的情况下,XML 是从上游拉取的内存中读取的,并且所有 XML 都在第一行。对于这种情况,请使用 .LinePosition - 运行得非常好。 - HerrimanCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接