【问题标题】:Sort XPath Or Operator Results对 XPath 或运算符结果进行排序
【发布时间】:2012-11-21 21:02:26
【问题描述】:

给定以下 XML:

<xml>
    <Table>
        <Product>
            <CaseName>Test 1</CaseName>
            <Beta>banana</Beta>
            <Alpha>apple</Alpha>
            <Delta>dates</Delta>
            <Chi>chiku</Chi>
        </Product>
        <Product>
            <CaseName>Test 2</CaseName>
            <Beta>borange</Beta>
            <Alpha>ared</Alpha>
            <Delta>dblue</Delta>
            <Chi>cgreen</Chi>
        </Product>
    </Table>
</xml>

我想使用 XPath 和“或”运算符 来指示返回 Product 下的节点的顺序,但不管我使用什么 XPath 语句, 查询结果总是按照原始 XML 的顺序返回。例如,以下 XPath 语句:

  1. //三角洲 | //案例名称 | //测试版
  2. //案例名称 | //测试版 | //三角洲
  3. //三角洲 | //测试版 | //案例名称

所有返回节点按以下顺序:CaseName、Beta、Delta、CaseName、Beta、Delta。此顺序与原始 XML 节点结构相匹配。 我可以使用什么 XPath 语句与“或”运算符一起按我想要的顺序返回节点?

我使用 C# 作为我的开发环境。

【问题讨论】:

  • 请贴一些你写的代码,以便人们可以更好地提供帮助

标签: c# xpath or-operator


【解决方案1】:

如果 XPath 不是必须的,可以使用 LinqToXml 对元素进行排序

XDocument xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename)
var products = xDoc.Descendants("Product")
                .Select(p => p.Elements().OrderBy(e => e.Name.LocalName).ToList())
                .ToList();

或者可能是这样的

List<string> names = new List<string>{ "CaseName", "Beta", "Delta" };

XDocument xDoc = XDocument.Parse(xml);
var products = xDoc.Descendants("Product")
                .Select(p => p.Elements()
                              .Where(e => names.Contains(e.Name.LocalName))
                              .OrderBy(e => names.IndexOf(e.Name.LocalName)).ToList())
                .ToList();

【讨论】:

  • XPath 不是必须的,所以这种技术会起作用;但是,当我尝试使用 XPath 时,我看不到您发布的内容与我指定的节点名称之间的联系。 使用您的示例,我如何使用节点名称来指定我希望节点返回的顺序?
  • 宾果游戏!这就是我一直在寻找的。谢谢!
【解决方案2】:

就 XPath 而言,您需要了解 XPath 1.0 只知道无序节点集,因此使用 //foo | //bar 您会得到一组 foobar 元素节点。然后大多数实现按文档顺序返回结果。

如果您希望能够定义需要使用 XPath 2.0(或 XQuery 1.0)的顺序,其中数据模型知道节点(和原子项目)的有序序列,您可以使用逗号运算符 , 作为在//foo, //bar 中获取foobar 元素节点的序列。但是,Microsoft .NET 框架类库不附带 XPath 2.0 实现,您需要使用 XmlPrime 或 Saxon 9 的 .NET 版本等第三方解决方案来切换。

【讨论】:

  • 谢谢,@MartinH。了解这一点很有用。
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多