c#在XML中获取带有name属性的数据

本文关键字:name 属性 数据 XML 获取 | 更新日期: 2023-09-27 18:11:51

我的xml文档中有一些字段是相同的值,但在不同的名称下。我想在这个xml文档中选择"Error"的值,因此想要显示"deger2"。我还想显示"deger5",我怎么能做到这一点?

<?xml version="1.0" encoding="UTF-8"?>
<Database xmlns="http://www.example.com/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Datas>
  <Data name="sMsg" access="private" xsi:type="collection" type="string">
     <Value key="Cycle" value="deger1" />
     <Value key="Error" value="deger2" />
     <Value key="Info" value="deger3" />
     <Value key="Jog" />
     <Value key="Warning" />
  </Data>
  <Data name="tTabla" access="private" xsi:type="array" type="tabla" size="1">
     <Value key="Cycle" value="deger4" />
     <Value key="Error" value="deger5" />
     <Value key="Info" value="deger6" />
     <Value key="Jog" />
     <Value key="Warning" />
  </Data>
 </Datas>
</Database>

c#在XML中获取带有name属性的数据

您应该考虑xml名称空间。使用Linq编辑Xml

var xDoc = XDocument.Parse(xmlstring); //XDocument.Load(filename)
XNamespace ns = "http://www.example.com/2";
var errors = xDoc.Descendants(ns + "Value") //<-- See the usage of ns
                .Where(d => (string)d.Attribute("key") == "Error")
                .Select(d => (string)d.Attribute("value"))
                .ToList();

编辑

是否有这样的选择方法:选择错误值,其中数据名称="tTabla"?

var errors = xDoc.Descendants(ns + "Data")
                .First(d => (string)d.Attribute("name") == "tTabla")
                .Descendants(ns + "Value") 
                .First(d => (string)d.Attribute("key") == "Error")
                .Attribute("value")
                .Value;

EDIT2

也可以使用XPATH

var nsmgr = new XmlNamespaceManager(xDoc.CreateNavigator().NameTable);
nsmgr.AddNamespace("ns", "http://www.example.com/2");
var errors = xDoc.XPathSelectElement("//ns:Data[@name='tTabla']/ns:Value[@key='Error']", nsmgr)
                    .Attribute("value")
                    .Value;

您也可以使用XPath选择它们:

XmlNodeList nodeList = root.SelectNodes("//Data/Value[@key="Error"]");