2014-12-16 3 views
-1

여기 내 XML이 있습니다. C#에서 XDocument를 사용하고 있습니다. 나는 "recordSetCount"를 얻고 싶다.C에서 다중 네임 스페이스가있는 XDocument #

<?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은 유효하지 않습니다. 혼란을 피하기 위해 더 나은 제목을주십시오. – 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

VAR 수 = (x.Descendants의 서비스 (N + "ShowPositionOpening") \t \t \t \t \t \t \t \t \t 선택 (문자열) service.Element (NN + "가 DataArea"). 요소에서 (NNN + " 표시 ") 특성 ("recordSetCount "). 값) .FirstOrDefault(); 나는 이것을 또한했다. 정말 고마워 – Backtrack