使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?

Posted

技术标签:

【中文标题】使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?【英文标题】:Is it possible to get line numbers/positions from a System.Xml.XmlNode when working with a System.Xml.XmlDocument?使用 System.Xml.XmlDocument 时是否可以从 System.Xml.XmlNode 获取行号/位置? 【发布时间】:2014-02-25 12:59:00 【问题描述】:

标题说明了一切......

在使用System.Xml.XmlDocument 时,是否可以从System.Xml.XmlNode 获取行号/位置?

我想要这些信息,以便我可以通知用户他们需要在 Xml 文件中查找特定信息的位置。我在 SO 上看到过与XmlReader 相关的类似问题,但没有任何内容能真正回答我的问题。

我想我可以在 xml 文件中搜索我感兴趣的节点的 OuterXml,但这似乎很麻烦,如果该信息多次出现在文件中怎么办?一定有更好的办法吗?

更新: 我正在使用以下方式加载我的 xml 文件:

xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(filename);

【问题讨论】:

C#: Line information when parsing XML with XmlDocument的可能重复 【参考方案1】:

我不确定这是否会对某人有所帮助,但我的目标与 OP 相似。在我的特殊情况下,我有一个 XmlDocument 并且我需要拥有所有文本框节点的行号。由于我得到了与 MadSkunk 描述的相同的异常,我认为唯一的方法是创建一个 XPathDocument 实例并进行转换。

Richard Schneider 的回答帮助我将其形象化。所以我现在的方法是这样的:

public Dictionary<int, string> GetLineNumber()

    Dictionary<int, string> attrByLineNumber = new Dictionary<int, string>();
    MemoryStream xmlStream = new MemoryStream();
    _xmlDoc.Save(xmlStream);
    xmlStream.Position = 0;
    XPathDocument pathDocument = new XPathDocument(xmlStream);
    foreach (XPathNavigator element in pathDocument.CreateNavigator().Select("//*"))
    
        if (element.Name.Equals("Textbox"))
        
            attrByLineNumber.Add(((IXmlLineInfo)element).LineNumber, element.GetAttribute("Name", ""));
        
    
    return attrByLineNumber;

【讨论】:

【参考方案2】:

您可以使用IXmlLineInfo interface 执行此操作。

我知道使用XDocumentXPathDocument,您可以将一个节点强制转换为IXmlLineInfo。我认为 XmlDocument 也可以。

【讨论】:

不,不能与 XmlDocument 一起使用 IXmlLineInfo 仅在信息由底层XmlReader 设置时才有帮助。 正如约翰建议的那样,您需要您的XmlReader 来设置线路信息。您能否发布您如何阅读 XmlDocument。 我更新了我的问题:我没有使用 XmlReader。 谢谢,但我已经尝试过了。我得到Unable to cast object of type 'System.Xml.XmlElement' to type 'System.Xml.IXmlLineInfo'...

以上是关于使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 XML - 从资源中读取、操作和显示

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)