如何选择特定的XML节点并获取其子节点中的值

时间:2017-12-29 10:22:42

标签: c# xml

我尝试选择特定节点并获取其子节点中的值。这通常很容易,但复杂的是节点具有相同的名称。我的xml看起来像这样;

<Settings>
  <Config>
  </Config>
  <Items>
    <Item>
      <ID>Hello</ID>
      <Pth>Somevalue</Pth>
      <Zvb>True</Zvb>
      <Ico>True</Ico>
    </Item>
    <Item>
      <ID>Stack</ID>
      <Pth>Somevalue</Pth>
      <Zvb>False</Zvb>
      <Ico>True</Ico>
    </Item>
    <Item>
      <ID>Overflow</ID>
      <Pth>Somevalue</Pth>
      <Zvb>False</Zvb>
      <Ico>True</Ico>
    </Item>
  </Items>
</Settings>

每个<ID>的innertext始终是唯一的。我现在想要选择<Item>,其中<ID>的内容是&#34; Stack&#34;。 (我还需要其他的childnode值,比如Pth,Zvb和Ico。所以<Item>下的所有内容基本上都是

我这样做是PowerShell,它看起来像这样;

$script:specificItem = $dgvItems.rows[$_.RowIndex].Cells[1].Value
$script:fetch = @($xml.SelectNodes('//Item')) | Select-Object * | Where { $_.ID -like $specificItem }

到目前为止,我已经得到了这个(我在数据网格视图的RowEnter事件中):

XmlDocument xml = new XmlDocument();
xml.Load(GlobalVars.configfile);

int rowindex = dgvItemlist.CurrentCell.RowIndex;
dgvItemlist.Rows[rowindex].Cells[2].Value.ToString(); //This will contain for example "Stack"

XmlNodeList Items = xml.SelectNodes("//Items/Item"); //probably other ways to start as well

...但是从这里开始我会过滤或选择我想要的那个。我知道这是一个相当普遍的问题,但我无法找到解决这个问题的好方法。

3 个答案:

答案 0 :(得分:2)

您还可以使用XDocument(Linq to XML):

string xml =@"<Settings>
  <Config>
  </Config>
  <Items>
    <Item>
      <ID>Hello</ID>
      <Pth>Somevalue</Pth>
      <Zvb>True</Zvb>
      <Ico>True</Ico>
    </Item>
    <Item>
      <ID>Stack</ID>
      <Pth>Somevalue</Pth>
      <Zvb>False</Zvb>
      <Ico>True</Ico>
    </Item>
    <Item>
      <ID>Overflow</ID>
      <Pth>Somevalue</Pth>
      <Zvb>False</Zvb>
      <Ico>True</Ico>
    </Item>
  </Items>
</Settings>";

XDocument xdoc = XDocument.Parse(xml);
XElement desired = xdoc.Descendants("Item").FirstOrDefault(x=>(string)x.Element("ID")=="Stack");
if(desired!=null)
{
    string Pth = (string)desired.Element("Pth");
    string Zvb = (string)desired.Element("Zvb");
    string Ico = (string)desired.Element("Ico");
}

desired将成为想要的元素。

答案 1 :(得分:1)

尝试将代码的最后一行更改为:

XmlNodeList Items = xml.SelectNodes("//Items/Item[ID='Stack']"); 

这应该返回:

<Item>
  <ID>Stack</ID>
  <Pth>Somevalue</Pth>
  <Zvb>False</Zvb>
  <Ico>True</Ico>
</Item>

答案 2 :(得分:1)

尝试以下方法。它将返回您要查找的特定节点。

XmlNode itemNode = doc.SelectSingleNode("//ID[text()='Stack']").ParentNode;