으로 관리하는 방법 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은 네임 스페이스로 가득 차 있으며 동적이어서 구조가 자주 변경됩니다.
직접 "경로"* 란 무엇을 의미합니까? XML에 네임 스페이스가 있으므로 XPath를 사용하려면 네임 스페이스 관리자가 필요합니다. 이야기의 끝. – Tomalak
온라인 Xpath가있는 @Tomalak은 "직접"경로를 테스트합니다. // * [local-name() = 's : SessionID'는 네임 스페이스를 관리하지 않고도 작동합니다. – Andoxko
그게 실제로 작동한다면 그건 그 특별한 온라인 XPath 테스터가 고장 났기 때문입니다. 'local-name()'은''s : SessionID ''와 같은 것을 반환하지 않습니다. – Tomalak