2016-08-22 4 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 /' для получения строго типизированного объекта C# для предоставленного 'xml'. Затем просто десериализуйте его. –

ответ

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'. Это более короткий код, чем мой. Упрощенный :) –

2

Путь, чтобы выбрать его, если с помощью Linq для 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 тщательно, и убедитесь, что выбранный узел не является нулевым после выбора его.

Смежные вопросы