2017-09-22 7 views
2

으로 관리하는 방법 C#으로 관리해야하는보다 복잡한 XML의 단순화 된 버전입니다.C#에서 콜론을 사용하여 XML 태그를 로컬 이름 XPATH

문제는 네임 스페이스 내의 태그에 액세스하려고 시도하면 XPATH이 작동하지 않는다는 것입니다.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><s:SessionID>abcde</s:SessionID></s:Body>"); 
string xpath = "//*[local-name()='s:SessionID']"; 
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText); 
//Object reference not set to an instance of an object 

하지만 코드는 태그의 콜론없이 완벽하게 작동합니다.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><SessionID>abcde</SessionID></s:Body>"); 
string xpath = "//*[local-name()='SessionID']"; 
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText); 
//abcde 

나는 "// * [로컬 이름() = 'S : 세션 ID가']"는 XPATH 검사기에 보장 한 잘 작동합니다.

내가 무엇을 놓치고 있습니까? 사전에

덕분에,

나는 정보에 대한 XmlNamespaceManager을 읽고 그러나 나는 "직접"경로를 사용하는 것을 선호합니다. XML은 네임 스페이스로 가득 차 있으며 동적이어서 구조가 자주 변경됩니다.

+1

직접 "경로"* 란 무엇을 의미합니까? XML에 네임 스페이스가 있으므로 XPath를 사용하려면 네임 스페이스 관리자가 필요합니다. 이야기의 끝. – Tomalak

+0

온라인 Xpath가있는 @Tomalak은 "직접"경로를 테스트합니다. // * [local-name() = 's : SessionID'는 네임 스페이스를 관리하지 않고도 작동합니다. – Andoxko

+1

그게 실제로 작동한다면 그건 그 특별한 온라인 XPath 테스터가 고장 났기 때문입니다. 'local-name()'은''s : SessionID ''와 같은 것을 반환하지 않습니다. – Tomalak

답변

0

기능 local-name() 반환 귀하의 경우 표현 '// * [로컬 이름은() ='S : 세션 ID ']'이유가 정확히 SessionID 것을 태그 이름의 로컬에 포함되지 않습니다 작업 (당신은 자격을 갖춘 이름이 아니라 문자열을 비교해야) 질문에서 그것보다 일을 나던 경우, 그래서 그냥 XPath 식

string xpath = "//s:SessionID"; 

를 사용 않다면 당신이의 SessionsID 요소를 선택에 관심이 나에게 보인다 접두어 s를 네임 스페이스 uri s = \ "sssssss \"로 묶어야합니다 (예제에서 가져옵니다)