java xml 节点路径,SelectSingleNode使用XPath为已知良好的xml节点路径返回null
回答(9)
2 years ago
我強烈懷疑問題與名稱空間有關 . 嘗試擺脫名稱空間,你會沒事的 - 但顯然這對你的實際情況沒有幫助,我認為這個文件是固定的 .
我不記得如何在XPath表達式中指定命名空間,但我確信這是問題所在 .
編輯:好的,我've remembered how to do it now. It'雖然不是很令人愉快 - 你需要為它創建一個 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);
}
}
2 years ago
如果要完全忽略名稱空間,可以使用:
static void Main(string[] args)
{
string xml =
"\n" +
" \n" +
" \n" +
"";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode idNode = doc.SelectSingleNode("/*[local-name()='My_RootNode']/*[local-name()='id']");
}
2 years ago
這應該適用于你的情況而不刪除命名空間:
XmlNode idNode = myXmlDoc.GetElementsByTagName("id")[0];
2 years ago
對不起,您忘記了命名空間 . 你需要:
XmlNamespaceManager ns = new XmlNamespaceManager(myXmlDoc.NameTable);
ns.AddNamespace("hl7","urn:hl7-org:v3");
XmlNode idNode = myXmlDoc.SelectSingleNode("/My_RootNode/hl7:id", ns);
事實上,無論是在這里還是在Web服務中,從XPath操作或依賴于XPath的任何東西獲取null通常都表明XML命名空間存在問題 .
2 years ago
嗯......我遇到了同樣的問題而且很頭疼 . 由于我不太關心命名空間或xml架構,我只是從我的xml中刪除了這些數據,它解決了我所有的問題 . 可能不是最好的答案?可能,但如果您不想處理所有這些并且您只關心數據(并且不會將xml用于其他任務),刪除命名空間可能會解決您的問題 .
XmlDocument vinDoc = new XmlDocument();
string vinInfo = "your xml string";
vinDoc.LoadXml(vinInfo);
vinDoc.InnerXml = vinDoc.InnerXml.Replace("xmlns=\"http://tempuri.org\/\", "");
2 years ago
只是為了解決命名空間問題,在我的情況下,我一直在運行具有多個命名空間的文檔,并且需要正確處理命名空間 . 我編寫了下面的函數來獲取命名空間管理器來處理文檔中的任何命名空間:
private XmlNamespaceManager GetNameSpaceManager(XmlDocument xDoc)
{
XmlNamespaceManager nsm = new XmlNamespaceManager(xDoc.NameTable);
XPathNavigator RootNode = xDoc.CreateNavigator();
RootNode.MoveToFollowing(XPathNodeType.Element);
IDictionary NameSpaces = RootNode.GetNamespacesInScope(XmlNamespaceScope.All);
foreach (KeyValuePair kvp in NameSpaces)
{
nsm.AddNamespace(kvp.Key, kvp.Value);
}
return nsm;
}
2 years ago
只需使用// id而不是/ id . 它在我的代碼中工作正常
2 years ago
要記住的規則是:如果您的文檔指定 namespace ,則必須在調用 SelectNodes() 或 SelectSingleNode() 時使用 XmlNamespaceManager . 這是好事 .
請參閱文章Advantages of namespaces . Jon Skeet在他的答案中做得很好,展示了如何使用 XmlNamespaceManager . (這個答案應該只是對答案的評論,但我沒有足夠的Rep Points來評論 . )
2 years ago
Roisgoen的回答對我有用,但為了使它更通用,你可以使用RegEx:
//Substitute "My_RootNode" for whatever your root node is
string strRegex = @"\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, "");
}
}
我完全承認這不是一個最佳實踐答案,但它是一個簡單的解決方案,有時這就是我們所需要的 .
總結
以上是生活随笔為你收集整理的java xml 节点路径,SelectSingleNode使用XPath为已知良好的xml节点路径返回null的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机进行频谱分析时,实验四-利用FF
- 下一篇: git 拉取远程其他分支代码_git切换