gpt4 book ai didi

c# - 如何使用多个 XPath 查询在 C# 中选择单个 XML 节点

转载 作者:行者123 更新时间:2023-12-04 15:18:06 25 4
gpt4 key购买 nike

我试图从基于两个查询的 XML 文件中选择一个节点,我有一个产品 ID,我需要最新条目 - 最高问题编号。

这是我的 XML 文件的格式:

<MyProducts>  
<Product code="1011234">
<ProductName>Product Name A</ProductName>
<ProductId>101</ProductId>
<IssueNumber>1234</IssueNumber>
</Product>
<Product code="1029999">
<ProductName>Product Name B</ProductName>
<ProductId>102</ProductId>
<IssueNumber>9999</IssueNumber>
</Product>
<Product code="1015678">
<ProductName>Product Name A2</ProductName>
<ProductId>101</ProductId>
<IssueNumber>5678</IssueNumber>
</Product>
</MyProducts>

我需要得到 <product>来自具有最高 IssueNumber 的 ProductId 的节点。例如,如果 ProductId 是 101,我想要第三个节点,如果它是 102,我想要第二个节点。文件中大约有 50 种不同的产品,分为三个不同的产品 ID。

我尝试了一些使用 SelectSingleNode 的 XPath 组合,要么使用特定的 ProductID 和 IssueNumber 节点,要么使用产品节点的代码属性(它是 Id 和 Issue 的组合),但没有成功。该代码当前使用 code 属性,但这只是因为我们还传递了问题编号,我希望能够在没有问题编号的情况下执行此操作(以减少前端维护),因为它始终是我们想要的最高问题。当前代码是这样的:

XmlNode productNode = productXml.SelectSingleNode("/MyProducts/Product[@code='" + productCode + "']");

我也用过这些,它们有点工作,但选择内部节点,而不是外部 Product 节点:

XmlNodeList productNodes = productXml.SelectNodes("/MyProducts/Product/ProductId[text()='101']");
XmlNodeList productNodes = productXml.SelectNodes("/MyProducts/Product[not (../Product/IssueNumber > IssueNumber)]/IssueNumber");

我想结合使用两者,像这样:

XmlNode productNode = productXml.SelectSingleNode("/MyProducts/Product/ProductId[text()='101'] and /MyProducts/Product[not (../Product/IssueNumber > IssueNumber)]/IssueNumber");

但这会返回错误“...抛出类型为‘System.Xml.XPath.XPathException’的异常”,但我也希望它无论如何都不会返回 Product 节点。这甚至可以在一行中完成,还是我必须遍历节点才能找到正确的节点?

最佳答案

使用 Xml Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication167
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);

var products = doc.Descendants("Product")
.OrderByDescending(x => (int)x.Element("IssueNumber"))
.GroupBy(x => (int)x.Element("ProductId"))
.Select(x => x.First())
.ToList();

Dictionary<int, XElement> dict = products
.GroupBy(x => (int)x.Element("ProductId"), y => y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());

XElement highestId = dict[101];

}
}



}

关于c# - 如何使用多个 XPath 查询在 C# 中选择单个 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63952792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com