0

给定以下 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# 作为我的开发环境。

4

2 回答 2

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();
于 2012-12-04T09:22:39.900 回答
0

就 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 版本。

于 2012-12-04T10:56:08.460 回答