0

问题- 我有一个加载 XML 文件的 Windows 应用程序,并且其他输入采用 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>

现在,我想检索 'trader' 元素值。如果我使用 XPath 查询作为

//*[local-name()="trader" and namespace-uri()='http://www.fpml.org/2005/FpML-4-2']

但是如果我给它,它就无法加载任何元素/FpML/trade/tradeHeader/partyTradeInformation/trader

为了选择具有默认命名空间的节点,我的 XPath 助手应用程序需要进行哪些更改。

先感谢您!

4

2 回答 2

0

然后,您没有太多选择,请使用 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:”并使用正确答案编辑我的答案;)

于 2017-09-14T07:51:13.747 回答
0

您可以使用以下方法删除命名空间:

        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();
于 2017-09-12T10:28:16.507 回答