나는 문제가 네임 스페이스와 관련이 있다고 강력히 의심한다. 네임 스페이스를 제거하면 괜찮습니다.하지만 문서가 수정되었다고 가정하는 실제 경우에는 도움이되지 않습니다.XPath 표현식에서 네임 스페이스를 지정하는 방법을 직접 기억할 수는 없지만 그게 문제라고 확신합니다.편집 : 좋아, 나는 그것을 지금하는 방법을 기억했습니다. 그래도별로 즐겁지는 않습니다
XmlNamespaceManager
.이를 위해 만들어야 합니다. 다음은 샘플 문서와 함께 작동하는 몇 가지 샘플 코드입니다.
using System;
using System.Xml;
public class Test
{
static void Main()
{
XmlDocument doc = new XmlDocument();
XmlNamespaceManager namespaces = new XmlNamespaceManager(doc.NameTable);
namespaces.AddNamespace("ns", "urn:hl7-org:v3");
doc.Load("test.xml");
XmlNode idNode = doc.SelectSingleNode("/My_RootNode/ns:id", namespaces);
string msgID = idNode.Attributes["extension"].Value;
Console.WriteLine(msgID);
}
}
-------------------
네임 스페이스를 완전히 무시하려면 다음을 사용할 수 있습니다.
static void Main(string[] args)
{
string xml =
"<My_RootNode xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"\">\n" +
" <id root=\"2.16.840.1.113883.3.51.1.1.1\" extension=\"someIdentifier\" xmlns=\"urn:hl7-org:v3\" />\n" +
" <creationTime xsi:nil=\"true\" xmlns=\"urn:hl7-org:v3\" />\n" +
"</My_RootNode>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode idNode = doc.SelectSingleNode("/*[local-name()='My_RootNode']/*[local-name()='id']");
}
-------------------
이것은 네임 스페이스를 제거하지 않고도 귀하의 경우에 작동합니다.
XmlNode idNode = myXmlDoc.GetElementsByTagName("id")[0];
-------------------
죄송합니다. 네임 스페이스를 잊어 버렸습니다. 다음이 필요합니다.
XmlNamespaceManager ns = new XmlNamespaceManager(myXmlDoc.NameTable);
ns.AddNamespace("hl7","urn:hl7-org:v3");
XmlNode idNode = myXmlDoc.SelectSingleNode("/My_RootNode/hl7:id", ns);
실제로 여기에서든 웹 서비스에서든 XPath 작업이나 XPath에 의존하는 모든 작업에서 null을 되 찾는 것은 일반적으로 XML 네임 스페이스에 문제가 있음을 나타냅니다.-------------------
글쎄 ... 나도 똑같은 문제가 있었고 두통이었다. 네임 스페이스 나 xml 스키마에 대해별로 신경 쓰지 않았기 때문에이 데이터를 xml에서 삭제하고 모든 문제를 해결했습니다. 최선의 답변이 아닐까요? 아마,하지만이 모든 것을 다루고 싶지 않고 데이터에만 관심이 있다면 (다른 작업에 xml을 사용하지 않을 것입니다) 네임 스페이스를 삭제하면 문제가 해결 될 수 있습니다.
XmlDocument vinDoc = new XmlDocument();
string vinInfo = "your xml string";
vinDoc.LoadXml(vinInfo);
vinDoc.InnerXml = vinDoc.InnerXml.Replace("xmlns=\"http://tempuri.org\/\", "");
-------------------
네임 스페이스 문제를 해결하기 위해 구축하기 위해 제 경우에는 여러 네임 스페이스가있는 문서를 실행하고 네임 스페이스를 올바르게 처리해야했습니다. 문서의 모든 네임 스페이스를 처리 할 네임 스페이스 관리자를 얻기 위해 아래 함수를 작성했습니다.
private XmlNamespaceManager GetNameSpaceManager(XmlDocument xDoc)
{
XmlNamespaceManager nsm = new XmlNamespaceManager(xDoc.NameTable);
XPathNavigator RootNode = xDoc.CreateNavigator();
RootNode.MoveToFollowing(XPathNodeType.Element);
IDictionary<string, string> NameSpaces = RootNode.GetNamespacesInScope(XmlNamespaceScope.All);
foreach (KeyValuePair<string, string> kvp in NameSpaces)
{
nsm.AddNamespace(kvp.Key, kvp.Value);
}
return nsm;
}
-------------------
명심해야 할 규칙은 다음과 같습니다. 문서에서을 지정하는 경우 또는 에 대한 호출에서를
namespace
사용해야합니다 . 그것은 좋은 일입니다.
XmlNamespaceManager
SelectNodes()
SelectSingleNode()
네임 스페이스의 장점
문서를 참조하십시오 . Jon Skeet은 사용 방법을 보여주는 그의 답변에서 훌륭한 작업을 수행합니다
XmlNamespaceManager
. (이 답변은 실제로 해당 답변에 대한 의견이어야하지만 의견을 제시 할 담당자 포인트가 충분하지 않습니다.)-------------------
/ id 대신 // id를 사용하십시오. 내 코드에서 잘 작동합니다.-------------------
Roisgoen의 대답은 저에게 효과적이지만 좀 더 일반적으로 만들려면 RegEx를 사용할 수 있습니다.
//Substitute "My_RootNode" for whatever your root node is
string strRegex = @"<My_RootNode(?<xmlns>\s+xmlns([\s]|[^>])*)>";
var myMatch = new Regex(strRegex, RegexOptions.None).Match(myXmlDoc.InnerXml);
if (myMatch.Success)
{
var grp = myMatch.Groups["xmlns"];
if (grp.Success)
{
myXmlDoc.InnerXml = myXmlDoc.InnerXml.Replace(grp.Value, "");
}
}
나는 이것이 최선의 방법이 아니라는 것을 완전히 인정하지만, 그것은 쉬운 해결책이고 때로는 그것이 우리에게 필요한 전부입니다.
출처
https://stackoverflow.com/questions/2005895