【问题标题】: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# xml .net-3.5 xmlnode


【解决方案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 执行此操作。

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

    【讨论】:

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