2011-03-23 8 views
0

이 XML 파일로 원하는 노드를 얻기 위해 적절한 XPATH 구문을 찾는 데 문제가 있습니다. 하나는 XML에 NameSPace가 없으므로 코드에 하나를 추가해야합니다. 나는 이것이 내 XPATH에 영향을 미친다고 생각한다.XPATH Help : XPathNodeIterator를 사용하여 네임 스페이스에서 XML 노드 찾기

나는이처럼 보이는 XML 파일이 있습니다

<configuration xmlns="http://schemas.microsoft.com/support/2003/02/config"> 
    <name>Content</name> 
    <description>Desc</description> 
    <lastModifiedBy>Me</lastModifiedBy> 
    <lastModifiedDate>2011-04-18T14:05:00</lastModifiedDate> 
    <section name="MaintenanceNotices"> 
    <key name="MaintenanceNote1" value="The Title Value" /> 
    <link id="1234" type="5" href="" target="_self" name="MaintenanceNote1a"> 
     <description>Description</description> 
    </link> 
    </section> 
</configuration> 

을 그래서, XPATH를 위해 내가 "구성"요소에 "이름"노드 값을 얻으려면을, 나는이를 사용하는 것이 가정 XPATH :

/configuration/name 

하지만 때로는 내가 NS를 추가해야합니다 그것을 :

/ns:configuration/ns:name 

을 그리고 나는 전자를 찾을 수 있습니다 값을 다음과 같이 조정하십시오 :

while (xmlNodeIterator.MoveNext()) { 
    result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString(); 
} 

그러나 이것은 전혀 효과가 없습니다. 그것은 xpath 내가 뭘하려고 상관없이 XML에서 어떤 가치를 찾아 실 거예요.

private string GetXML() 
    { 
     string result = string.Empty; 
     string fileName = "Content.xml"; 
     string filePath = "C:\\Content\\{0}"; 

     XPathDocument xdoc = new XPathDocument(string.Format(filePath, fileName)); 

     var nav = xdoc.CreateNavigator(); 

     XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 
     nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/taxonomy/2003/1"); 
     nsmgr.AddNamespace("gds", "http://support.microsoft.com/common/schemas/gdsPage/1/"); 

     string sectionName = "MaintenanceNotices"; 
     string xpath = "/configuration"; 

     // section[name={0}]"; ///key[name=MaintenanceNote1]/"; 

     XPathNodeIterator xmlNodeIterator = nav.Select(string.Format(xpath, sectionName), nsmgr); 

     while (xmlNodeIterator.MoveNext()) 
     { 
      result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString(); 
     } 

     return result; 
    } 

당신은 어떤 문제가 있거나 내 XPath는 구문에 대한 제안을 제공 할 수

: 여기 내 코드는?

감사합니다. 당신은 결코 당신의 문서의 노드에있는 네임 스페이스를 등록하지 것을 제외하고 나는, 당신의 XPath를 잘못 아무것도 표시되지 않습니다

+0

[C#으로 원하는 XPath를 작동하지 않습니다]의 중복 가능성 (http://stackoverflow.com/questions/2576024/xpath-doesnt-work-as -desired-in-c) –

답변

1

는 :

"http://schemas.microsoft.com/support/2003/02/config" 

그것은 당신이 이미 해당 언어 (어떻게 해야할지처럼 보인다 AddNamespace 사용), 어쩌면 그것은 단지 감시 일뿐입니다. 자세한 정보가 필요하면이 도움이 될 것입니다

+0

나는 찾고있는 노드가 지정된 네임 스페이스에 있음을 xpath에 알리기 위해 각 노드의 앞부분에 ns :를 추가해야한다. 나는 그것을 줄 것이다. 감사. – nocarrier

+0

@Shawn - 무언가를 놓치지 않는 한'http : // schemas.microsoft.com/taxonomy/2003/1'에'ns '를 바인딩하지만 문서는'http://schemas.microsoft .com/support/2003/02/config' 네임 스페이스. –

+0

제 네임 스페이스가 잘못되었습니다. 그것이 문제였습니다. 네임 스페이스 존중! 고맙습니다. – nocarrier

1

@lwburk 말했듯이, 당신은 네임 스페이스를 등록해야합니다.

SELECT 문은 다음과 같아야합니다

var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr) 
관련 문제