C# 对XPath或运算符结果进行排序
给定以下XML:C# 对XPath或运算符结果进行排序,c#,xpath,or-operator,C#,Xpath,Or Operator,给定以下XML: <xml> <Table> <Product> <CaseName>Test 1</CaseName> <Beta>banana</Beta> <Alpha>apple</Alpha> <Delta>dates</Delta>
<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>
测试1
香蕉
苹果
日期
奇库
测试2
波兰奇
阿雷德
蓝色
绿色
我想使用XPath和“or”操作符来指定Product下节点的返回顺序,但不管我使用的XPath语句是什么,查询结果总是按照原始XML的顺序返回。例如,以下XPath语句:
我使用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();
List name=新列表{“CaseName”、“Beta”、“Delta”};
XDocument xDoc=XDocument.Parse(xml);
var products=xDoc.substands(“产品”)
.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 framework类库没有XPath 2.0实现,您需要使用它来切换到第三方解决方案,如XmlPrime或.NET版本的Saxon 9。请发布一些您编写的代码,以便人们可以帮助改进XPath。XPath不是必须的,因此此技术可以工作;但是,我看不到您发布的内容与我在尝试使用XPath时指定的节点名称之间的联系。使用您的示例,我如何使用节点名称来指定我希望节点返回的顺序?宾果!这就是我要找的。谢谢谢谢,马丁。了解这一点很有用。