如何使用Xml中的属性值访问元素名称

时间:2015-06-16 06:51:46

标签: c# xml xmldocument

我有一个包含代码的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<car_ads>
<car_make make="suzuki" adj_kw="null">
<model data_type="string"adj_kw="null" class="کار_ماڈل ">
   <model_instance>ALTO</model_instance>
   <model_instance>KHYBER</model_instance>
</model>
<year data_type="integer" adj_kw="yes" class="ایر ">
   <adj_kw>ماڈل </adj_kw>
   <adj_kw>ء</adj_kw>
</year>
<price data_type="string" adj_kw="yes" class=" قیمت  " >
    <adj_kw>قیمت  </adj_kw>
    <adj_kw>ڈیمانڈ </adj_kw>
</price>
</car_make>
<car_make make="سوزوکی" adj_kw="null">
<model data_type="string" adj_kw="null" class="کار_ماڈل ">
    <model_instance>alto</model_instance>
    <model_instance>آلٹو</model_instance>
</model>
<year data_type="integer" adj_kw="yes" class="ایر ">
    <adj_kw>ماڈل </adj_kw>
    <adj_kw>ء</adj_kw>
    <adj_kw>ایئرآفمینوفیکچرنگ </adj_kw>
</year>
<price data_type="string" adj_kw="yes" class=" قیمت  " >
    <adj_kw>قیمت  </adj_kw>
    <adj_kw>ڈیمانڈ </adj_kw>
</price>
</car_make>
</car_ads>

我在c#

中使用XmlDocument解析它
string xmlText = File.ReadAllText(@"G:\\car_xml_final.xml");
var doc = new XmlDocument();
doc.LoadXml(xmlText);

如果我知道属性值(例如我的示例属性class =“ایر”),我想获得相应的元素名称(即element =“year”)。

2 个答案:

答案 0 :(得分:0)

感谢@Charles Mager指出XmlDocumentXDocument之间的区别。如果使用XDocument,则可以使用LINQ:

var element = doc.Root.Descendants().FirstOrDefault(e => e.Attribute("class") == " ایر");
var elementName = element.Name;

或XPath:

var element = doc.XPathSelectElement("//[@class=' ایر']");
var elementName = element.Name;

获得理想的结果。

如果您坚持XmlDocument,那就是SelectSingleNode方法:

var element = doc.DocumentElement.SelectSingleNode("descendant::[class=""' ایر'""]");

答案 1 :(得分:0)

如其他答案中所述,您可以使用SelectSingleNode()SelectNodes()XmlDocument获取特定元素,并将XPath表达式作为参数传递,例如:

var result = doc.SelectNodes("//*[@class='ایر ']");
foreach (XmlNode node in result)
{
    //print element name
    Console.WriteLine(node.Name);
}

关于正在使用的XPath的简要说明:

  • //*:选择所有元素,无论名称(*)如何,都在XML文档中的任何位置//)...
  • [@class='some_class_here']:...具有类属性值等于某个类名