C#操作XML(带命名空间)
之前文章讲述了使用c# xpath如何操作xml文件,在实际开发项目中,遇到的很多xml文件都是带有命名空间的,如果还是用之前的代码获取,那将获取到null。
本文讲解操作代码有命名空间的Xml文件,以及多个命名空间的xml。
XML文件如下:Books.xml
如用之前代码:
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"Books.xml");
XmlNodeList nodelist = xml.SelectNodes("/bookstore/book");
nodelist返回的值永远是null,原因是:如果XPath表达式没有加前缀(如a:b中前缀是a),那么所查询节点(注意属性也可以是节点)的命名空间URI就应该是空值(也是默认值),否则XPath不会返回结果。
现在要想获取到节点,则需要添加命名空间,具体代码如下:
本文讲解操作代码有命名空间的Xml文件,以及多个命名空间的xml。
XML文件如下:Books.xml
<?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不会返回结果。
现在要想获取到节点,则需要添加命名空间,具体代码如下:
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"); 也可以取到值。
附上完整代码:
XmlDocument xmldoc = new XmlDocument(); //加载xml文件 xmldoc.Load(@"E:\Test\Test\xx.xml"); XmlNamespaceManager xmlns = new XmlNamespaceManager(xmldoc.NameTable); xmlns.AddNamespace("a", "http://www.52taiqiu.com"); XmlNodeList nodelist = xmldoc.SelectNodes("a:Root/a:News/a:New",xmlns); foreach (XmlNode n in nodelist) { XmlElement el = (XmlElement)n; string id = el.GetAttribute("id"); string date = el.GetAttribute("date"); string title = xmldoc.SelectSingleNode("a:Root/a:News/a:New/a:Title", xmlns).InnerText; string url = xmldoc.SelectSingleNode("a:Root/a:News/a:New/a:Url", xmlns).InnerText; } ----------
编程是个人爱好