给出以下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语句:
按以下顺序返回所有节点:CaseName,Beta,Delta,CaseName,Beta,Delta。此顺序与原始XML节点结构匹配。 我可以使用什么XPath语句与“或”运算符按照我想要的顺序返回节点?
我正在使用C#作为我的开发环境。
答案 0 :(得分: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();
答案 1 :(得分:0)
就XPath而言,您需要了解XPath 1.0只知道无序节点集,因此使用//foo | //bar
可以获得一组foo
和bar
个元素节点。然后,大多数实现按文档顺序返回结果。
如果您希望能够定义使用XPath 2.0(或XQuery 1.0)所需的顺序,其中数据模型知道有序的节点序列(和原子项),那么您可以使用逗号运算符{{1} }在,
中获取//foo, //bar
和foo
个元素节点的序列。但是,Microsoft .NET框架类库没有附带XPath 2.0实现,您需要使用切换到第三方解决方案,如XmlPrime或.NET版本的Saxon 9。