我尝试选择特定节点并获取其子节点中的值。这通常很容易,但复杂的是节点具有相同的名称。我的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
...但是从这里开始我会过滤或选择我想要的那个。我知道这是一个相当普遍的问题,但我无法找到解决这个问题的好方法。
答案 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;