.net C# XML按值选择节点中的单个子节点

epggiuax  于 2023-02-06  发布在  .NET
关注(0)|答案(3)|浏览(131)

我有以下问题,我想选择与作者"约翰尼dapp33"的书,不幸的是没有工作。
XML代码:

<employees xmlns:bar="http://www.bar.org">
    <employee id="Test1">
        <name>Johnny Dapp</name>
        <author>Al Pacino</author>
    </employee>
     <employee id="Test2">
        <name>Johnny Dapp33</name>
        <author>Al Pacino</author>
    </employee>
</employees>

我本来想通过". SelectSingleNode"尝试一下,不幸的是我总是用XPath失败。
谢谢你的帮助!

moiiocjp

moiiocjp1#

假设我们的项目目录中有一个名为Employees.xml的文件。
我们可以使用以下赋值语句将xml文件加载到内存中:

XmlDocument doc = new XmlDocument();
doc.Load("Employees.xml");

其次,我们尝试在结构employees/employee(这是我们的路径)中通过id查找单个节点(假设),不,我们必须添加搜索参数(在本例中为id),如下所示:

XmlNode singleNode = doc.SelectSingleNode("/employees/employee[@id='Test1']");
Console.WriteLine(singleNode.OuterXml);

但是,如果我们只知道要查找的名称,我们也可以像这样搜索该特定值。我们在employee节点中搜索值为Johnny Dapp 33的name节点值:

XmlNode singleNode = doc.SelectSingleNode("descendant::employee[name='Johnny Dapp33']");
Console.WriteLine(singleNode.OuterXml);
9jyewag0

9jyewag02#

在处理XML时,最好使用LINQ to XMLAPI。
自2007年以来,它在.Net Framework中提供。

c#

void Main()
{
    const string filePath = @"e:\Temp\WizardZZ.xml";
    XDocument xdoc = XDocument.Load(filePath);
        
    var employee = xdoc.Descendants("employee")
      .Where(d => d.Elements("name").FirstOrDefault().Value.Equals("Johnny Dapp33"));
      
     Console.WriteLine(employee);
}

产出

<employee id="Test2">
  <name>Johnny Dapp33</name>
  <author>Al Pacino</author>
</employee>
0x6upsns

0x6upsns3#

如果需要使用XPath(而且必须有一个 * 非常充分的理由 *),可以将其与XElement一起使用:

var xml = """
<employees xmlns:bar="http://www.bar.org">
    <employee id="Test1">
        <name>Johnny Dapp</name>
        <author>Al Pacino</author>
    </employee>
     <employee id="Test2">
        <name>Johnny Dapp33</name>
        <author>Al Pacino</author>
    </employee>
</employees>
""";

var x = XElement.Parse(xml);
var employees = x.XPathSelectElements("/employee[name='Johnny Dapp33']");

if (employees is not null)
{
  foreach (var employee in employees)
  {
    WriteLine((string)employee.Element("name") ?? "[name] not found");
  }
}
else
{
  WriteLine("did not find any employees");
}

相关问题