2011-11-07 17 views
0

我有一個XML文件是這樣的:如何將XML節點內部文本與相同的後代進行比較?

<Tests> 
    <Test> 
     <Name>Test1</Name> 
     <Type>A</Type> 
    </Test> 
    <Test> 
     <Name>Test2</Name> 
     <Type>A</Type> 
    </Test> 
    <Test> 
     <Name>Test3</Name> 
     <Type>B</Type> 
    </Test> 
</Tests> 

我怎樣才能返回一個字符串數組或列表,它僅包含Test這theire類型爲A的名字嗎?

我正在嘗試使用此代碼,但沒有成功!

XPathNodeIterator it = nav.Select("/Tests/Test[Type = 'A']/Name) 
+0

您的XPath表達式是正確的。你能否詳細說明「不成功」是什麼意思? –

+0

目前它返回所有'Name'節點,我會再看一遍並回報。 –

+0

這是因爲您的XPath表達式確實匹配'Name'元素。您應該移除'/ Name'來代替'Test'元素。 –

回答

1

在你的問題中的XPath表達式匹配Name元素。如果你想匹配Test元素代替,你必須刪除/Name部分:

XPathNodeIterator it = nav.Select("/Tests/Test[Type = 'A']); 

如果你想使用XPathNavigator,從那裏,你可以調用MoveToChild()到導航指向Name元素:

foreach (XPathNavigator elemNav in it) { 
    elemNav.MoveToChild("Name", ""); 
    string name = elemNav.Value; 
    // Do something with 'name'... 
} 
2

難道你不想試試linq2xml嗎?

using System.Xml.Linq; 
using System.Linq; 

///////////

XElement root = new XElement("Tests", 
    new XElement("Test", 
    new XElement("Name", "Test1"), 
    new XElement("Type", "A")), 
    new XElement("Test", 
    new XElement("Name", "Test2"), 
    new XElement("Type", "A")), 
    new XElement("Test", 
    new XElement("Name", "Test3"), 
    new XElement("Type", "B"))); 

string[] result = (from xe in root.Elements() 
        where xe.Element("Type").Value.Equals("A") 
        select xe.Element("Name").Value).ToArray(); 
相關問題