[英]Accessing a child node by name of an XML document using C#
我遇到這樣的情況,一個XML文檔包含類似於以下內容的內容,但是隨后更改了“塊”元素的順序,在一個應用程序中,我正在使用GetElementsByTagName(“ Amount”)[]訪問in的值。 0] .InnerText,因為它是“金額”的首次出現。 然后,“塊”的順序發生了變化,GetElementsByTagName返回的“數量”仍然是第一個出現,但是我希望始終返回“塊1”中的“數量”。 如何在C#中完成此操作?
之前:
<Response xmlns="testsite.com/schema/TestService/2015-01-01">
<Block1>
<Amount>$5.00</Amount>
</Block1>
<Block2>
<Amount>$0.00</Amount>
</Block2>
<Block3>
<Amount>$0.00</Amount>
</Block3>
</Response>
后:
<Response xmlns="testsite.com/schema/TestService/2015-01-01">
<Block2>
<Amount>$0.00</Amount>
</Block2>
<Block3>
<Amount>$0.00</Amount>
</Block3>
<Block1>
<Amount>$5.00</Amount>
</Block1>
</Response>
C#:
XmlDocument doc = new XmlDocument();
doc.LoadXml(response);
string amount = doc.GetElementsByTagName("Amount")[0].InnerText;
但是,在我的根元素中,我有類似
<Response xmlns="testsite.com/schema/TestService/2015-01-01">
它是xml的默認xmlnamespece。 使用您提供的新信息
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("ns", "testsite.com/schema/TestService/2015-01-01");
var value = doc.SelectSingleNode("/ns:Response/ns:Block1/ns:Amount", mgr).InnerText;
您可以使用SelectSingleNode
方法和XPath表達式來訪問所需的數據。 您還需要使用名稱空間管理器並導入正確的名稱空間:
var namespaceManager= new XmlNamespaceManager(doc.NameTable);
namespaceManager.AddNamespace("a", "testsite.com/schema/TestService/2015-01-01");
var xmlNode = doc.SelectSingleNode("/a:Response/a:Block1/a:Amount", namespaceManager);
var value = node.InnerText; // prints $5.00
不管Block1在何處-第一個,第二個或第三個元素,此類代碼都會為您找到正確的值。 方法SelectSingleNode
返回與表達式匹配的第一個節點,因此,如果XML中有多個Block1元素,則結果可能不是您期望的
從System.Xml.Linq開始; 您將要加載xml文件,然后解析您的文檔。 例如,
var doc = XDocument.Load("file.xml");
IEnumerable<XElement> elements = doc.Descendants(tagNameHere);
如果要創建這些后代的列表,則可以通過執行以下操作來訪問這些元素:
List<string> myElements = new List<string>();
XElement element = elements.ElementAt(0);
myElements.Add(element.Value);
這只是為了讓您入門。 我建議你在這里閱讀:
https://msdn.microsoft.com/zh-CN/library/system.xml.linq(v=vs.110).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.