首页 文章

如何使用XPath忽略名称空间

提问于
浏览
86

我的目标是使用XPath从具有多个名称空间的多个xml文件中提取某些节点 . 只要我知道名称空间URI,一切正常 . 命名空间名称本身保持不变,但模式(XSD)有时是客户端生成的,即我不知道 . 然后我基本上有三种选择:

  • 只使用命名空间的一个模式,希望没有出错(我能确定吗?)

  • 获取文档的子节点并查找带有命名空间URI的第一个节点,希望它在那里并只使用URI,希望它是正确的 . 可能由于多种原因而出错

  • 以某种方式告诉xpath:“看,我不关心名称空间,只需找到具有此名称的所有节点,我甚至可以告诉您名称空间的名称,而不是URI” . 这就是问题......

这不是对herehere所发现的众多问题的重复 . 我知道如何使用命名空间感知 . 只是没有如何摆脱它 .

3 回答

  • 124

    您可以使用 local-name() XPath函数 . 而不是选择像这样的节点

    /path/to/x:somenode
    

    您可以选择所有节点并过滤具有正确本地名称的节点:

    /path/to/*[local-name() = 'somenode']
    
  • 15

    您可以使用更简洁的语法在_910959中执行相同的操作:

    /path/to/*:somenode
    
  • 0

    您可以在XmlTextReader上使用Namespace = false

    [TestMethod]
    public void MyTestMethod()
    {
        string _withXmlns = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <ParentTag xmlns=""http://anyNamespace.com"">
    <Identification value=""ID123456"" />
    </ParentTag>
    ";
    
        var xmlReader = new XmlTextReader(new MemoryStream(Encoding.Default.GetBytes(_withXmlns)));
    
        xmlReader.Namespaces = false;
    
        var content = XElement.Load(xmlReader);
    
        XElement elem = content.XPathSelectElement("/Identification");
    
        elem.Should().NotBeNull();
        elem.Attribute("value").Value.Should().Be("ID123456");
    }
    

    用:

    using System;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    using System.Xml.XPath;
    using FluentAssertions;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    

相关问题