【问题标题】:Find the index of an xml element in text C#在文本 C# 中查找 xml 元素的索引
【发布时间】:2014-12-05 09:11:18
【问题描述】:

我正在制作一个在 FlowDocument 中显示 XML 的 WPF 应用程序,用户可以使用 XPath 在此 XML 中选择一个或多个元素。我希望能够突出显示 XPath 在 FlowDocument 中选择的元素的值。我目前正在研究使用this method 突出显示。问题是,由于 FlowDocument 显示一个字符串,我需要找到 XPath 在此字符串中表示的任何元素的索引 - 我不能简单地将其作为文本搜索,因为它可能会产生错误的匹配。有什么建议我可以如何做到这一点?

【问题讨论】:

  • 您使用的是哪个 XML API?
  • 当前将 XML 的副本存储在 XmlDocument 中以通过 XPath 查找元素

标签: c# xml wpf xpath


【解决方案1】:

如果您乐于改用 LINQ to XML(它通常是一个更好的 API),并且如果知道行号和行内的位置就足够了,您可以使用 IXmlLineInfo

using System;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

class Program
{
    static void Main(string[] args)
    {
        var xml = XDocument.Load("test.xml", LoadOptions.SetLineInfo);
        var xpath = "/root/child";
        var result = xml.XPathSelectElements(xpath);
        foreach (var element in result)
        {
            var info = (IXmlLineInfo) element;
            Console.WriteLine("{0}:{1} {2}",
                              info.LineNumber,
                              info.LinePosition,
                              element);
        }
    }
}

您也完全有可能将其与XmlElement 一起使用,但我不确定如何使用。当然,这不会为您提供字符位置 - 但除此之外,您可以自己合理地轻松计算出每行开头的字符位置。当然,可能还有其他东西可以指定确切的角色位置——我只是没见过。

【讨论】:

  • 如果我将FlowDocument 的文本设置为与我加载到XDocument 中的相同文本字符串(使用流),则LinePosition 在执行@987654328 时似乎不正确@
  • @user2609051:“似乎不正确”并没有给我们提供太多信息——特别是,FlowDocument 中的行可能被包裹在某个地方。请用一个具体的例子更新你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多