2014-12-16 6 views
-1

Вот мой xml. Я использую XDocument в C#. Я хочу получить «recordSetCount».XDocument с несколькими пространствами имен в C#

<?xml version="1.0" encoding="utf-8"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ShowPositionOpening xmlns="http://data.usajobs.gov"> 
     <ApplicationArea xmlns="http://www.openapplications.org/oagis/9"> 
     <CreationDateTime>2014-12-11T04:05:41</CreationDateTime> 
     </ApplicationArea> 
     <DataArea xmlns="http://www.hr-xml.org/3"> 
     <Show recordSetCount="6" recordSetTotal="6" recordSetCompleteIndicator="false" recordSetReferenceId="1" xmlns="http://www.openapplications.org/oagis/9"> 
      <OriginalApplicationArea> 
      <CreationDateTime>2014-12-11T04:05:41</CreationDateTime> 
      </OriginalApplicationArea> 
     </Show> 

Я попытался, как ниже

var namespaceManager = new XmlNamespaceManager(new NameTable()); 
namespaceManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/"); 

var jobCount = x.XPathSelectElement("/s:Envelope/s:Body/ShowPositionOpening/DataArea/Show/@recordSetCount", namespaceManager).Value; 

но это вмятина работы. Также попробовал как ниже

XNamespace xmlns = "http://www.openapplications.org/oagis/9"; 
XNamespace xmlns1 = "http://data.usajobs.gov"; 
XNamespace x1 = "http://www.hr-xml.org/3"; 

var jobCount = x.Element("ShowPositionOpening") 
       .Element(xmlns1 + "DataArea") 
       .Element(x1 + "Show") 
       .Attribute("recordSetTotal"); 

Но это не сработало. Что пошло не так. Может кто-нибудь мне помочь?

+0

Привет @abatishchev. Я прошу проблему в моем коде. Я не спрашивал, как использовать несколько namespcae – Backtrack

+0

привет, хорошо, я вижу, извините. – abatishchev

+0

Ваш xml isn действительно. Пожалуйста, дайте вашему вопросу лучшее название, чтобы избежать дальнейших путаниц. – abatishchev

ответ

3

Ваши данные имеют несколько пространств имен, в которых каждый ребенок находится в другом пространстве имен, вам необходимо соответствующим образом настроить свои запросы.

 
ShowPositionOpening http://data.usajobs.gov 
DataArea    http://www.hr-xml.org/3 
Show     http://www.openapplications.org/oagis/9 
var namespaceManager = new XmlNamespaceManager(new NameTable()); 
namespaceManager.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/"); 
namespaceManager.AddNamespace("X", "http://data.usajobs.gov"); 
namespaceManager.AddNamespace("XX", "http://www.hr-xml.org/3"); 
namespaceManager.AddNamespace("XXX", "http://www.openapplications.org/oagis/9"); 
// you'll need to change this to XPathEvaluate 
// since you're not evaluating to an element 
var JobCount = x.XPathEvaluate("/s:Envelope/s:Body/X:ShowPositionOpening/XX:DataArea/XXX:Show/@recordSetCount", namespaceManager); 

или с помощью LINQ:

XNamespace n = "http://data.usajobs.gov"; 
XNamespace nn = "http://www.hr-xml.org/3"; 
XNamespace nnn = "http://www.openapplications.org/oagis/9"; 
var JobCount = x.Descendants(n + "ShowPositionOpening") 
       .Elements(nn + "DataArea") 
       .Elements(nnn + "Show") 
       .Attributes("recordSetCount") 
       .SingleOrDefault(); 
+0

граф вар = (от службы в x.Descendants (п + "ShowPositionOpening") \t \t \t \t \t \t \t \t \t выберите (строка) service.Element (пп + "DataArea"). Элемент (NNN + " Show ") Атрибут (" recordSetCount ") Value) .FirstOrDefault(). Я сделал это тоже. Большое спасибо – Backtrack

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