【问题标题】:Get all possible XPath expressions with XPathNavigator class?使用 XPathNavigator 类获取所有可能的 XPath 表达式?
【发布时间】:2016-04-12 09:32:47
【问题描述】:

我已经有一个算法来检索 Xml 的 XPath 表达式:

但是,它是不完善的,不安全的,并且需要大量的额外修饰来格式化获得的表达式。 (对于所需格式的示例,我的意思是:Get avaliable XPaths and its element names using HtmlAgilityPack

然后,我最近发现了 XPathNavigator 类,为了以任何方式提高我当前代码的可靠性,我想知道使用 XPathNavigator 类是否可以检索所有Xml 文档的 XPath 表达式,因为这样我的算法可以基于 .Net 框架逻辑及其规则的效率,而不是单个程序员的不完美逻辑。

我在 C# 或 Vb.Net 中搜索解决方案。

这是我尝试过的:

    Dim xDoc As XDocument =
        <?xml version="1.0"?>
        <Document>
            <Tests>
                <Test>
                    <Name>A</Name>
                    <Value>0.01</Value>
                    <Result>Pass</Result>
                </Test>
                <Test>
                    <Name>A</Name>
                    <Value>0.02</Value>
                    <Result>Pass</Result>
                </Test>
                <Test>
                    <Name>B</Name>
                    <Value>1.01</Value>
                    <Result>Fail</Result>
                </Test>
            </Tests>
        </Document>

    Dim ms As New MemoryStream
    xDoc.Save(ms, SaveOptions.None)
    ms.Seek(0, SeekOrigin.Begin)

    Dim xpathDoc As New XPathDocument(ms)
    Dim xpathNavigator As XPathNavigator = xpathDoc.CreateNavigator

    Dim nodes As XPathNodeIterator = xpathNavigator.Select(".//*")

    For Each item As XPathNavigator In nodes
        Console.WriteLine(item.Name)
    Next

使用该代码,我只能获得这种(不希望的)输出:

Document
Tests
Test
Name
Value
Result
Test
Name
Value
Result
Test
Name
Value
Result
Test
Name
Value
Result

是否可能使用 XPathNavigator 类提取所有 XPath 表达式?。

【问题讨论】:

  • 给定文档上所有可能的 XPath 表达式的集合是无限的。事实上,即使返回非空结果的集合也是无限的。因此,在尝试枚举它们之前,您应该更准确地定义您的需求。
  • 在以下网页上查看递归方法:stackoverflow.com/questions/28976601/…
  • 也许您需要退后一步,告诉我们为什么您需要检索所有可能的 XPath 表达式,正如您现在所知道的那样,这是不可能的。你最终想要达到什么目的?

标签: c# xml vb.net xpath xpathnavigator


【解决方案1】:

不,这是不可能的。使用 XPath 选择特定节点的方法有很多种。您可能会为任何给定节点确定一些“规范”XPath 的概念,但即使这样听起来也很难指定,XPathNavigator 没有内置的这种概念可以帮助您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多