2016-08-22 42 views
2

价值我有一个XML文档,它看起来像:C# - 从一个特定的标签获取XML文档

<?xml version="1.0" encoding="UTF-8"?> 
<cbn:PaidOrderNotification xmlns:cbn="http://xml.test.com/3.12.0.0/test.xsd"> 
    <cbn:NotificationDate>2016-08-01T07:28:46.679414Z</cbn:NotificationDate> 
    <cbn:Purchase cbt:Id="95368158" xmlns:cbt="http://xml.test.com/3.12.0.0/testTypes.xsd"> 
     <cbt:Status>Test Order</cbt:Status> 
     <cbt:Items> 
      <cbt:Item cbt:RunningNo="1"> 
       <cbt:ProductId>178732</cbt:ProductId> 
       <cbt:Payment cbt:SubscriptionId="S18767146"> 
        <cbt:CancelUrl>https://store.test.com/</cbt:CancelUrl> 
        <cbt:ChangeUrl>https://test.com/</cbt:ChangeUrl> 
       </cbt:Payment> 
      </cbt:Item> 
     </cbt:Items> 
     <cbt:ExtraParameters /> 
    </cbn:Purchase> 
</cbn:PaidOrderNotification> 

使用C#,我想进去<cbt:CancelUrl>标签值。我怎样才能做到这一点?

+0

当我必须使用XML时,我更喜欢用xsd创建一个类。检查我的答案:http://stackoverflow.com/questions/23243018/step-over-node-in-vb-net-xml-parsing/23243339#23243339 – Rumpelstinsk

+0

使用'http:// xmltocsharp.azurewebsites.net /''为所提供的'xml'获取强类型的C#对象,然后将其反序列化。 –

回答

4

首先阅读xml文件,如:

var doc = new XmlDocument(); 
      doc.LoadXml(_xml); 

,那么你可以这样写:

string CancelUrl = doc.GetElementsByTagName("cbt:CancelUrl")[0].InnerText; 
string ChangeUrl = doc.GetElementsByTagName("cbt:ChangeUrl")[0].InnerText; 
+0

我没有很好的使用旧的'XmlDocument'。这是比我的代码更短的代码。 Upvoted :) –

2

的方式来选择它,如果使用LINQ to XML是有如下定义XNamespace对象:

XNamespace cbt = "http://xml.test.com/3.12.0.0/testTypes.xsd"; 

var result = XDocument.Load("data.xml").Root 
     .Descendants(cbt + "CancelUrl") 
     .FirstOrDefault()?.Value; 

//result - https://store.test.com/ 
+0

是的,它有帮助。我赞成你的解决方案,但接受了另一个,因为它更短更清晰。谢谢:) – eg16

+0

@ eg16 - 没问题:)谢谢 –

1

XmlDocument类机智h XmlNamespaceManager将支持获取数据所需的XPath表达式。

//Load the document 
XmlDocument order = new XmlDocument(); 
order.Load("filepath.xml"); 

实例化命名空间管理:

XmlNamespaceManager xmlns = new XmlNamespaceManager(order.NameTable); 
xmlns.AddNamespace("cbt", "http://xml.test.com/3.12.0.0/testTypes.xsd"); 

现在你可以使用命名空间管理器中选择您所需要的信息。 此XPath表达式("//cbt:CancelUrl")在整个文档中选择任何CancelUrl节点,并且可以使用更合适的路径更具体。

string xpath = "//cbt:CancelUrl" 
XmlNode cancelUrl = Order.SelectSingleNode(xpath, xmlns); 
string value = cancelUrl.InnerText; 

您可能要指定XPath更仔细,并确保您选择后,所选择的节点不为空。