操作XML(带命名空间)

之前文章讲述了使用c# xpath如何操作xml文件,在实际开发项目中,遇到的很多xml文件都是带有命名空间的,如果还是用之前的代码获取,那将获取到null。

本文讲解操作代码有命名空间的Xml文件,以及多个命名空间的xml。

go 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://example.books.com">
  <book genre="autobiography" publicationdate="1991" ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <sp:book genre="novel" publicationdate="1967" ISBN="0-201-63361-2" xmlns:sp="http://example.book.com">
    <title>The Confidence Man</title>

    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </sp:book>
  <book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

如用之前代码:

XmlDocument xmldoc = new XmlDocument();

xmldoc.Load(@"Books.xml");

XmlNodeList nodelist = xml.SelectNodes("/bookstore/book");

nodelist返回的值永远是null,原因是:如果XPath表达式没有加前缀(如a:b中前缀是a),那么所查询节点(注意属性也可以是节点)的命名空间URI就应该是空值(也是默认值),否则XPath不会返回结果。

现在要想获取到节点,则需要添加命名空间,具体代码如下:

go 复制代码
  XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(@"Books.xml");
        XmlNamespaceManager xmlns = new XmlNamespaceManager(xmldoc.NameTable);
        xmlns.AddNamespace("sd", "http://example.books.com");//默认的命名空间也要添加 前缀
        xmlns.AddNamespace("sp",   "http://example.book.com");
        XmlNodeList nodelist = xmldoc.SelectNodes("/sd:bookstore/sp:book", xmlns);

分析:

xmlDocument.SelectNodes("a:Root/a:News/a:New",命名空间管理) 命名空间管理需要绑定 xmlDocument.NameTable

NameTable是一个链表结构 存储唯一的属性(包含前缀)和元素(包含前缀)名字

如果不使用xPath来取值,使用XmlNodeList nodelist = xmldoc.GetElementsByTagName("New"); 也可以取到值。

相关推荐
fatiaozhang95271 小时前
中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开启ADB ROOT安卓固件-方法3
android·xml·adb·电脑·电视盒子·刷机固件
l1t2 天前
轻量级XML读写库Mini-XML的编译和使用
xml·c语言·解析器
微笑伴你而行2 天前
标注格式转换csv转xml
xml
fatiaozhang95272 天前
中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
android·xml·电脑·电视盒子·刷机固件·机顶盒刷机
Ray Song2 天前
【FastDDS】XML profiles
xml·中间件·自动驾驶·dds·fastdds
l1t2 天前
我改写的二分法XML转CSV文件程序速度追上了张泽鹏先生的
xml·c语言·人工智能·算法·expat
困到晕阙3 天前
[NCTF2019]Fake XML cookbook
xml·xxe
ruleslol3 天前
五分钟XML速成
xml
令狐少侠20114 天前
maven settings.xml文件的各个模块、含义以及它们之间的联系
xml·maven
l1t4 天前
张泽鹏先生手搓的纯ANSI处理UTF-8与美团龙猫调用expat库读取Excel xml对比测试
xml·人工智能·excel·utf8·expat