给定以下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 |//
- CaseName |//beta /
- /caseName |//beta |//Delta //Delta |//
- 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
,您可以获得一组 foo
和bar
元素节点。然后,大多数实现按文档顺序返回结果。
如果您希望能够定义需要使用 XPath 2.0(或 XQuery 1.0)的顺序,其中数据模型知道节点(和原子项)的有序序列,则可以使用逗号运算符,
,如 //foo, //bar
中所示,获取foo
和bar
元素节点的序列。但是,Microsoft.NET 框架类库没有附带 XPath 2.0 实现,您需要使用 切换到第三方解决方案,如 XmlPrime 或 .NET 版本的 Saxon 9。