操作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"); 也可以取到值。

相关推荐
yuren_xia13 小时前
Spring XML 配置
xml·java·spring
BOB-wangbaohai13 小时前
Flowable7.x学习笔记(十四)查看部署流程Bpmn2.0-xml
xml·笔记·学习
聪明的墨菲特i13 小时前
SQL进阶知识:九、高级数据类型
xml·数据库·sql·mysql·json·空间数据类型
小刘同学++1 天前
Qt 处理 XML 数据
xml·qt
曹牧1 天前
Java:XML被自动转义
xml·java·开发语言
FL171713141 天前
Mujoco & robosuite 机器人模型
xml·java·机器人
程序员的世界你不懂2 天前
关于 xpath 查找 XML 元素的一点总结
xml
limengshi1383922 天前
使用Python将YOLO的XML标注文件转换为TXT文件格式
xml·python·yolo
亮学长3 天前
介绍XML
xml
攒了一袋星辰3 天前
Spring如何通过XML注册Bean
xml·java·spring