2014-07-07 80 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"]");