2011-12-20 4 views
0

로드 기능이 이미 XMLDATA 클래스XPathSelectElements 반환

public class XmlData 
{ 
    public void Load(XElement xDoc) 
    { 
     var id = xDoc.XPathSelectElements("//ID"); 
     var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS"); 
    } 
} 

난 그냥 내 끝에서로드 함수를 호출하고 있습니다에 정의되어줍니다.

  XmlData aXmlData = new XmlData(); 

      string input, stringXML = ""; 
      TextReader aTextReader = new StreamReader("D:\\test.xml"); 
      while ((input = aTextReader.ReadLine()) != null) 
      { 
       stringXML += input; 
      } 
      XElement Content = XElement.Parse(stringXML); 
      aXmlData.Load(Content); 

로드 기능에서 im은 id 및 listIds를 모두 null로 가져옵니다.

내 test.xml의는

<SEARCH> 
    <ID>11242</ID> 
    <Lists> 
    <List CURRENT="true" AGGREGATEDCHANGED="false"> 
     <ListIDS> 
     <ListID>100567</ListID> 
     <ListID>100564</ListID> 
     <ListID>100025</ListID> 
     <ListID>2</ListID> 
     <ListID>1</ListID> 
     </ListIDS> 
    </List> 
    </Lists> 
</SEARCH> 

답변

6

편집을 포함 : 샘플 XML nss 별칭 네임 스페이스에 id 요소가 없습니다. 이 경우 <nss:id>이되거나 기본 네임 스페이스가 설정됩니다. 나는이 답변에 대해 당신이 찾고있는 요소가 실제로는 이 네임 스페이스에이라고 가정했다.

쿼리가 루트 수준에서 id이라는 요소를 찾으려고합니다. 모든id 요소를 찾으려면, 다음이 필요합니다

var tempId = xDoc.XPathSelectElements("//nss:id", ns); 

... 개인적으로 내가 사용하는 거라고하지만 :

XDocument doc = XDocument.Parse(...); 
XNamespace nss = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"; 
// Or use FirstOrDefault(), or whatever... 
XElement idElement = doc.Descendants(nss + "id").Single(); 

(I XPath를 대신 XML 형식에 LINQ의 쿼리 메소드를 사용하여 선호 ... 바보 같은 구문 오류 등을 피하는 것이 더 쉽다는 것을 알고 있습니다.)

xDoc을 사용하고 있기 때문에 샘플 코드도 명확하지 않습니다. co 예제를 컴파일하고 콘솔 앱으로 실행하는 데 필요한 모든 것을 포함하는 것이 이상적입니다.

+0

불량 코드 ic 지금 내 코드를 orrected했습니다. xml의 요소는 이 아니며 이 아닙니다. Content1.XPathSelectElements ("// nss : id", ns), Content1.XPathSelectElements ("// id", ns)와 같이 시도했지만 아무것도 작동하지 않습니다. ( – mathesh

+0

@mathesh : 네임 스페이스, 왜 네임 스페이스 한정 버전을 사용하려고 했습니까? 어느 쪽이든, 개인적으로 XPath가 아닌 콘텐츠를 찾는 데 XElement/XDocument 메서드를 사용하고 있습니다. –

+0

기본적으로 과 같은 네임 스페이스에있는 다른 요소가 있습니다. 이 방식으로 ID를 얻으려고 시도하는 임. XPath를 사용하는 상황에서. 요즘에는 XPath를 사용하여 ID를 얻는 사람이 있습니까? – mathesh

0
 string xmldocument = "<response xmlns:nss=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\"><action>test</action><id>1</id></response>"; 

     XElement Content = XElement.Parse(xmldocument); 
     XPathNavigator navigator = Content.CreateNavigator(); 
     XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable); 
     ns.AddNamespace("nss", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"); 
     var tempId = navigator.SelectSingleNode("/id"); 
+0

thanks.but XPathSelectElements – mathesh

1

제출 된 지 3 시간 후 그리고 마지막으로 편집 된 후 41 분이 지났습니다.

제공된 XML 문서에 정의 된 네임 스페이스가 없습니다.

var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS"); 

XML 문서가 Lists라는 이름의 상위 요소가 없기 때문에이 XPath 표현식은 분명히 제공된 XML 문서에서 노드를 선택하지 않는 (실제 상위 요소의 이름은 SEARCH입니다)로드 기능에

var id = xDoc.XPathSelectElements("//ID"); 

, 메신저 점점 ID와 및 널 (null)로 listIds 모두. //ID가 null 인 C# 1의 변수 id 따라서 값 제공된 XML 문서 ID라는 유일한 요소를 선택하기 때문에

문은 거짓이다. 아마도 XML 문서를 편집 한 후에 철저히 테스트하지 않았을 것입니다.

아마도 원래 ID 요소가 일부 네임 스페이스에 속해있었습니다.그러나 이제는 "네임 스페이스 없음"에 있고 위의 XPath식이 선택합니다.

+0

구문을 사용해야합니다. 구문이 잘못되었습니다. 나는 var listIds = xDoc.XPathSelectElements ("/ Lists // List/ListIDS/ListID");를 제공해야한다. var 대신에 listIds = xDoc.XPathSelectElements ("/ Lists // List/ListIDS/ListIDS"); – mathesh

+0

@mathesh : 아니요, *'/ Lists '로 시작하는 모든 * XPath 표현식은 제공된 XML 문서에 대해 평가할 때 0 요소를 선택합니다. 매우 간단합니다 : 제공된 XML 문서의 Top 요소는'Lists'가 아니라'SEARCH'라고합니다. 당신은 입문서/튜토리얼을 읽고 적어도 XPath의 기초를 배워야합니다. –

0

null 값 또는 시스템 반환 값에 대한 이유는 다음

var id = xDoc.XPathSelectElements("//ID"); 

XpathSElectElements에 의한 것은 LINQ 쿼리 날짜입니다 System.xml.linq.XElment이다. 직접 출력 할 수는 없습니다. 개별 첫 번째 일치 요소를 가져 오려면 XPathSelectElement ("// ID"); 당신은

var count=xDoc.XPathSelectElements("//ID").count(); 

로 XPathSelectElements를 사용하여 발생 횟수를 확인할 수 있습니다 당신은 또한 u는이

을 사용할 수있는 목록에서 노드 값을 얻기 위해 특정 조건

에게

중위를 사용하여 순서와 LINQ 문을 조회 할 수 있습니다

foreach (XmlNode xNode in xDoc.SelectNodes("//ListIDS/ListID")) 
{ 
Console.WriteLine(xNode.InnerText); 
} 

두 번째 목록에서 값을 얻었으므로 목록 항목의 XPath가 올바르지 않습니다.

+0

감사합니다. 지금 가치를 얻었습니다. 내 코드 비트를 변경했습니다. var listIds = xDoc.XPathSelectElements ("/ Lists // List/ListIDS/ListID");를 사용했습니다. var 대신에 listIds = xDoc.XPathSelectElements ("/ Lists // List/ListIDS/ListIDS"); – mathesh