簡體   English   中英

使用C#通過XML文檔的名稱訪問子節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM