读取XML文件节点带有冒号

上一篇 / 下一篇  2018-01-31 10:52:34 / 个人分类:总结

 昨天在写一个测试用例脚本,读取XML文件中节点的属性值,遇到一个问题,XML根节点下的子节点有冒号如下,开始读的时候按照平常的读取的逻辑,结果怎么也读取不到,不加冒号读取不到,加冒号后报错。
  <AppendApp Name="L">
<start:Tile UserID="***">
<start:Tile UserID="!!!">
<start:Tile UserID="&&&">
  </AppendApp>

查了下资料,原来带冒号的节点,冒号前的start代表的是命名空间,冒号后的才是根节点名称。
 了解了具体情况后,再来看看读取情况:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("layout.xml");
XmlNodeList  start=xmlDoc.GetElementsByTagName("start:Tile");
foreach(XmlNode xn in start)
{
XmlElement xe=(XmlElement)xn;
string proper=xe.GetAttribute("UserID");
if(proper.equals("!!!"))
{
Console.WriteLine("find the node");
}
else
Console.WriteLine("find failed");
}
    执行结果:
find failed
find the node
        find failed

    可以用XNamespace先获取命名空间
   XNamespace xns="start" ;
  XmlNodeList start=xmlDoc.GetElementsByTagName(xns+"Tile");

如果用Descendants方法来获取带有命名空间的节点,必须包含命名空间。如下:
<a:root xmlns:a="http://ww.abc.com/">
    <a:book>aaaa</a:book>
</a:root>

直接用 var ele=from item in xDoc.Descendants("a:book") select item;直接这样用是会报错,需要改为如下:
XDocument xDoc =XDocument.Load("a.xml");
 XNamespace n=@"http://www.abc.com";varele =fromiteminxDoc.Descendants(n +"book")selectitem.Value;

先声明一个XNamespace类变量,把XML文件中出现的命名空间 http://ww.abc.com/ 赋值给它,然后再读取节点的时候,与真正的节点名称book进行拼接就可以了!
XML中出现命名空间的原因是,当你需要使用多个XML一起工作时,由于两个文档都包含带有不同内容和定义的节点元素,就会发生命名冲突,加上命名空间使用可以避免发生冲突,这与C#编程中类的命名空间的用处差不多。
       

TAG:

 

评分:0

我来说两句

Open Toolbar