[英]Generic XML XPath helper with C#
問題 -我有一個Windows應用程序,該應用程序加載XML文件,而其他輸入則使用XPath從給定的XML獲取用戶想要的數據(顯然這不是問題)。 我用來從給定的XPath加載元素的代碼片段就像-
XPathDocument docNav;
XPathNavigator nav;
XPathNodeIterator NodeIter;
XmlNamespaceManager manager;
docNav = new XPathDocument(fileName);
nav = docNav.CreateNavigator();
nav.MoveToFollowing(XPathNodeType.Element);
IDictionary<string, string> names = nav.GetNamespacesInScope(XmlNamespaceScope.All);
manager = new XmlNamespaceManager(nav.NameTable);
foreach (KeyValuePair<string, string> item in names)
{
manager.AddNamespace(item.Key, item.Value);
}
NodeIter = nav.Select(path, manager);
我有一個示例XML,如下所示-
<FpML xmlns:ns="http://www.fpml.org/2005/FpML-4-2">
<header>
<messageId>ts4-XYZ</messageId>
<sentBy>XYZ</sentBy>
<creationTimestamp>2017-07-08T08:05:53.929Z</creationTimestamp>
</header>
<trade>
<tradeHeader>
<partyTradeIdentifier>
<partyReference href="OUR_PARTY"/>
<tradeId tradeIdScheme="uniqueId">AAAAAA</tradeId>
</partyTradeIdentifier>
<partyTradeInformation>
<partyReference href="OUR_PARTY"/>
<trader>dummy trader name</trader>
</partyTradeInformation>
<tradeDate>2017-07-08</tradeDate>
<tsfpml:completedDateTime>2017-07-08T08:05:53.656Z</tsfpml:completedDateTime>
</tradeHeader>
</trade>
</FpML>
現在,我想檢索“交易者”元素值。 如果我將XPath查詢用作
//*[local-name()="trader" and namespace-uri()='http://www.fpml.org/2005/FpML-4-2']
但是,如果我提供/FpML/trade/tradeHeader/partyTradeInformation/trader
它將無法加載任何元素
通常,為了選擇具有默認名稱空間的節點,我的XPath幫助器應用程序中需要進行哪些更改。
先感謝您!
您可以使用刪除名稱空間:
public static string RemoveAllNamespaces(string xmlDocument)
{
XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument));
return xmlDocumentWithoutNs.ToString();
}
private static XElement RemoveAllNamespaces(XElement xmlDocument)
{
if (!xmlDocument.HasElements)
{
XElement xElement = new XElement(xmlDocument.Name.LocalName);
xElement.Value = xmlDocument.Value;
foreach (XAttribute attribute in xmlDocument.Attributes())
xElement.Add(attribute);
return xElement;
}
return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
}
並由調用:
var doc = new XmlDocument();
doc.Load(fileName);
doc.InnerText = RemoveAllNamespaces(doc.InnerText);
var nav = doc.CreateNavigator();
然后,您沒有太多選擇,請使用XmlNamespaceManager:
var docNav = new XPathDocument("");
var nav = docNav.CreateNavigator();
XmlNamespaceManager nsmanager = new XmlNamespaceManager(docNav.NameTable);
nsmanager.AddNamespace("x", "ns:http://www.fpml.org/2005/FpML-4-2");
var nodes = nav.Select(@"/x:FpML/trade/tradeHeader/partyTradeInformation/trader", nsmanager);
它應該工作。 我無法測試自己,但如果無法正常工作,請測試更改不含“ ns:”的命名空間uri,或在XPath中添加其他名稱“ x:”,然后使用正確答案編輯我的答案;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.