对 XPath 或运算符结果进行排序



给定以下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 和"or"运算符来指示 Product 下节点的返回顺序,但无论我使用的 XPath 语句如何,查询结果始终按原始 XML 的顺序返回。 例如,以下 XPath 语句:

    //Delta |//
  1. CaseName |//beta
  2. /
  3. /caseName |//beta |//Delta
  4. //Delta |//
  5. beta |//CaseName
所有返回节点按以下顺序排列:案例名称、测试版、增量、

案例名称、测试版、增量。此顺序与原始 XML 节点结构匹配。我可以将哪个 XPath 语句与"or"运算符一起使用,以按我想要的顺序返回节点?

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

如果 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 1.0 只知道无序节点集,因此通过 //foo | //bar,您可以获得一组 foobar元素节点。然后,大多数实现按文档顺序返回结果。

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

最新更新