日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java xml 节点路径,SelectSingleNode使用XPath为已知良好的xml节点路径返回null

發布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。