2011-10-31 5 views
6

같은 간단한 질문을 귀찮게해서 미안하지만, 한 시간부터 여기 붙어있어 :XmlElement.SelectNodes (..) - 아무것도 찾지 못합니다. 도움말?

<?xml version="1.0" encoding="utf-8"?> 
<aaa xmlns="http://blabla.com/xmlschema/v1"> 

    <bbb> 
    <ccc>Foo</ccc> 
    </bbb> 

    <ddd x="y" /> 
    <ddd x="xx" /> 
    <ddd x="z" /> 

</aaa> 

내가 액세스하려고 해요 :

나는 다음과 같은 형태의 XML 파일이 이 같은 요소 'DDD'내가 다시 .SelectNodes 방법에서 모든 노드를하지 않기 때문에

var doc = new XmlDocument(); 
doc.Load("example.xml"); 
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd")) 
{ 
    // do something 
    Console.WriteLine(dddNode.Attributes["x"].Value); 
} 

런타임에 foreach 루프가 생략됩니다. 나는 루프 이전에 깨졌고 InnerXML을 살펴 보았다. 괜찮 았는데, 모든 종류의 XPath (예 : "// bbb"또는 "/ aaa/ddd")를 시도했지만 "/"만 반환하지 않는 것 같다. 없는.

이 정확한 코드는 이전에 나를 위해 작동했지만 지금은 그렇지 않습니다. 나는 aaa 태그에서 그 네임 스페이스 선언으로 뭔가 의심 스럽지만, 이것이 왜 문제를 일으키는 지 알 수 없었다. 아니면 .. 내가 놓칠지도 모르는 것을 볼 수 있니?

답변

10

이것은 xml-namespaces입니다. ddd은 없습니다. 그러나 x:ddd이 있으며 http://blabla.com/xmlschema/v1의 별명은 x입니다. 당신은 네임 스페이스를 테스트해야합니다 - 예를 들면 :

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1"); 
var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr); 
// nodes has 3 nodes 

참고 위의 임의의 x; 편리함 이외에는 x에는 아무런 의미가 없습니다.

는 (오히려 불편) (위와 같이, 또는 별칭) 당신의 XPath 식의 모든에 네임 스페이스를 추가하는 것을 의미한다.

관련 문제