[英]Reading a Attribute name based on attribute value from xml in C#
I am trying to get the node names based on the attribute values, but I am not able to proceed much on this, if anyone can help me on this. 我试图根据属性值获取节点名称,但是如果有人可以帮助我,我将无法继续进行下去。
I have the sample xml as below: 我有以下示例XML:
<ns0:Person xmlns:ns0="http://temp.poc">
<name>
<value>temp</value>
<status>T</status>
</name>
<age>
<value>tempval</value>
<status>F</status>
</age>
<cellNumber>
<value>9971760613</value>
<status>T</status>
</cellNumber>
<city>
<value>Bangalore</value>
<status>F</status>
</city>
<ApplicationAccess>
<value>value_0</value>
<status>T</status>
</ApplicationAccess>
</ns0:Person>
Based on the Status , where status = "T" , I need the node names as output. 基于Status,其中status =“ T”,我需要节点名称作为输出。 for eg : 例如:
assistant
cellNumber
ApplicationAccess
You can achieve that using XmlDocument
and XPath
, like this: 您可以使用XmlDocument
和XPath
来实现,如下所示:
string xml = @"
<ns0:Person xmlns:ns0='http://temp.poc'>
<name>
<value>temp</value>
<status>T</status>
</name>
<age>
<value>tempval</value>
<status>F</status>
</age>
<cellNumber>
<value>9971760613</value>
<status>T</status>
</cellNumber>
<city>
<value>Bangalore</value>
<status>F</status>
</city>
<ApplicationAccess>
<value>value_0</value>
<status>T</status>
</ApplicationAccess>
</ns0:Person>";
var doc = new XmlDocument();
doc.LoadXml(xml);
XmlNodeList nodes = doc.SelectNodes("//status[text() ='T']");
foreach (XmlNode node in nodes)
{
Console.WriteLine(node.ParentNode.Name);
}
output will be names of those nodes whose child node status
has T
as innerText. 输出将是其子节点status
以T
作为innerText的那些节点的名称。
name
cellNumber
ApplicationAccess
Using XDocument
(which I prefer over XmlDocument
): 使用XDocument
(我更喜欢XmlDocument
):
var root = XDocument.Load(...).Root; // the <ns0:Person> XElement
var namesOfElementWithStatusT = root.Elements()
.Where(e => e.Elements().Any(e1 => e1.Name == "status" && e1.Value == "T"))
.Select(e => e.Name.LocalName)
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.