【问题标题】:Select nodes attribute in XML file using C#使用 C# 在 XML 文件中选择节点属性
【发布时间】:2014-02-12 10:07:34
【问题描述】:

在以下 XML 文件中,我尝试将所有 id 属性保存在一个列表中:

<?xml version="1.0"?>
<PressReleases>
  <PressRelease id="545" version="1">
    <Name>Convert number to string</Name>
    <Date>20/05/1985</Date>
    <Input>1</Input>
    <Output>One</Output>
  </PressRelease>
  <PressRelease id="544" version="1">
    <Name>Find succeeding characters</Name>
    <Date>19/05/1985</Date>
    <Input>abc</Input>
    <Output>def</Output>
  </PressRelease>
  <PressRelease id="543" version="1">
    <Name>Convert multiple numbers to strings</Name>
    <Date>17/05/1985</Date>
    <Input>123</Input>
    <Output>One Two Three</Output>
  </PressRelease>
  <PressRelease id="542" version="1">
    <Name>Find correlated key</Name>
    <Date>02/05/1985</Date>
    <Input>a1</Input>
    <Output>b1</Output>
  </PressRelease>
  <PressRelease id="541" version="1">
    <Name>Count characters</Name>
    <Date>04/02/1985</Date>
    <Input>This is a test</Input>
    <Output>14</Output>
  </PressRelease>
  <PressRelease id="540" version="1">
    <Name>Another Test</Name>
    <Date>09/01/1985</Date>
    <Input>Test Input</Input>
    <Output>10</Output>
  </PressRelease>
</PressReleases>

此代码块仅保存在第一个 Press Release 节点 (545) 中写入的第一个 Id。 我需要所有这些(545,544 等)

    XmlDocument doc = new XmlDocument();
    doc.Load(@"C:\Users\ARNAUDR\Desktop\test.xml");
    //string xmlcontents = doc.InnerXml;

    XmlNodeList xnList = doc.SelectNodes("/PressReleases");
    List<int> IDsInDistantXML = new List<int>();
    foreach (XmlNode xn in xnList)
    {
        XmlNode PressRelease = xn.SelectSingleNode("PressRelease");
        if (PressRelease != null)
        {
            IDsInDistantXML.Add(Convert.ToInt16(PressRelease.Attributes["id"].Value));
        }
    }

提前感谢您的帮助

【问题讨论】:

    标签: c# xml xmlnode


    【解决方案1】:

    我建议你使用 Linq to Xml:

    XDocument xdoc = XDocument.Load(@"C:\Users\ARNAUDR\Desktop\test.xml");
    List<int> ids = xdoc.Root.Elements("PressRelease")
                        .Select(pr => (int)pr.Attribute("id"))
                        .ToList();
    

    注意:您的问题是您始终从根中选择第一个(单个节点) PressRelease 节点,并且您正在枚举根节点(始终为一个)而不是枚举 PressRelease 节点。这是固定的解决方案:

    XmlNodeList pressReleases = doc.SelectNodes("/PressReleases/PressRelease");
    List<int> IDsInDistantXML = new List<int>();
    foreach (XmlNode pr in pressReleases)    
        IDsInDistantXML.Add(Convert.ToInt32(pr.Attributes["id"].Value));    
    

    【讨论】:

    • +1 用于实际指出问题。如果他将第一个 XPath 表达式调整为/PressReleases/PressRelease,然后对结果进行迭代,他可以达到相同的效果。但是使用 LINQ to XML 更优雅。
    • @Dirk 谢谢 :) 已经发布了带有正确 XPath 选择器的固定解决方案
    【解决方案2】:

    或者,如果您只需要一个属性,请将您的 SelectNodes xpath 直接更改为节点:

    List<int> IDsInDistantXML = new List<int>();
    foreach (var xn in doc.SelectNodes("/PressReleases/PressRelease"))
    {
        IDsInDistantXML.Add(Convert.ToInt16(xn.Attributes["id"].Value));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多