2014-07-07 65 views
-3

我的xml文档中有一些字段的值相同,但名称不同。我想在这个xml文档中选择“Error”的值,所以想显示“deger2”。我也想显示“deger5”我该怎么做?C#在XML中获取名称属性的数据

<?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> 

回答

2

你应该把XML命名空间为considiration。使用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(); 

编辑

Is there any way to select like this: select error value where Data name="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; 
+0

@Downvoter ????? –

+0

有没有什么办法可以像这样选择:select error value where Data name =“tTabla”? – tebdilikiyafet

+0

@tebdilikiyafet看到编辑.... –

0

ü也可以使用XPath来选择他们:

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