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

相关推荐
前网易架构师-高司机5 天前
带标注的驾驶员安全带识别数据集,识别率99.5%,可识别有无系安全带,支持yolo,coco json,pascal voc xml格式
xml·yolo·数据集·交通·安全带
逍遥德5 天前
Maven教程.01- settings.xml 文件<profile>使用详解
xml·java·maven
逍遥德5 天前
Maven教程.03-如何阅读pom.xml文件
xml·java·后端·maven
松叶似针6 天前
Flutter三方库适配OpenHarmony【doc_text】— .docx 解析全流程:从 ZIP 解压到 XML 提取
xml·flutter·harmonyos
松叶似针6 天前
Flutter三方库适配OpenHarmony【doc_text】— parseDocxXml:正则驱动的 XML 文本提取
xml·flutter
2301_780669867 天前
MyBatis(配置,增删改查,注解与XML两种开发方式)、SpringBoot配置文件(yml简化properties)
xml·spring boot·mybatis·javaweb
强子感冒了9 天前
JSON和XML学习笔记
xml·学习·json
сокол12 天前
【网安-Web渗透测试-漏洞系列】XXE漏洞
xml·web安全·php
树码小子13 天前
Mybatis(13)MyBatis Generator(xml生成器)& Mybatis-Plus初识
xml·mybatis
MX_935918 天前
Spring xml 方式整合第三方框架总结加案例
xml·java·spring