使用默认名称空间读取XML

扬·B·凯德森

考虑一下这项工作:

static void XMLTest(Args _args)
{
    str xml = @'<?xml version="1.0" encoding="UTF-8"?>
       <tests xmlns="abc">
           <test>
               <testnumber><id>1</id></testnumber>
               <testname>bla bla</testname>
           </test>
       </tests>
   ';
   XMlDocument doc = XMLDocument::newXML(xml);
   XMLNodeList tests = doc.selectNodes('//tests/test');
   XMLNode node;
   for (node = tests.nextNode(); node; node = tests.nextNode())
   {
       info(node.selectSingleNode('testnumber/id').text());
       info(node.selectSingleNode('testname').text());
   }
}

它按预期输出“ 1”和“ bla bla”。

现在,从以下位置更改xml的第二行:

<tests>

至:

<tests xmlns="xyz">

现在,它无法读取任何内容。

如何使用默认名称空间读取XML?

DAXaholic

您可以像这样通过XMLNamespaceManager的实例严格地做到这一点

static void XMLTest(Args _args)
{
    str xml = @'<?xml version="1.0" encoding="UTF-8"?>
       <tests xmlns="abc">
           <test>
               <testnumber><id>1</id></testnumber>
               <testname>bla bla</testname>
           </test>
       </tests>
   ';
   XMlDocument doc = XMLDocument::newXML(xml);
   XMLNamespaceManager nsMgr = new XMLNamespaceManager(new XmlNameTable());
   XMLNodeList tests;
   XMLNode node;
   ;

   nsMgr.addNamespace('x', 'abc');
   tests = doc.selectNodes("//x:tests/x:test", nsMgr);

   for (node = tests.nextNode(); node; node = tests.nextNode())
   {
       info(node.selectSingleNode('x:testnumber/x:id', nsMgr).text());
       info(node.selectSingleNode('x:testname', nsMgr).text());
   }
}

如果确定不会发生命名冲突,则可能要忽略名称空间,并通过local-name()匹配节点,如下所示

static void XMLTest2(Args _args)
{
    str xml = @'<?xml version="1.0" encoding="UTF-8"?>
       <tests xmlns="abc">
           <test>
               <testnumber><id>1</id></testnumber>
               <testname>bla bla</testname>
           </test>
       </tests>
   ';
   XMlDocument doc = XMLDocument::newXML(xml);
   XMLNodeList tests = doc.selectNodes("//*[local-name()='tests']/*[local-name()='test']");
   XMLNode node;
   for (node = tests.nextNode(); node; node = tests.nextNode())
   {
       info(node.selectSingleNode("*[local-name()='testnumber']/*[local-name()='id']").text());
       info(node.selectSingleNode("*[local-name()='testname']").text());
   }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

XML名称空间默认/继承

更改使用JAXWS生成的默认XML名称空间前缀

无法使用默认名称空间写入XML文件

如何使用包含多个名称空间的spark读取XML文件?

默认的XML名称空间,JDOM和XPath

默认声明哪些XML名称空间?

重置单个元素的默认XML名称空间

具有默认名称空间的XML :: LibXML

无法从名称空间读取xml节点

如何删除默认名称空间并使用C#在xml的根标记中添加自定义名称空间?

关于使用Saxon使用默认名称空间对xml进行xpath解析

如何使用python获取具有默认名称空间的xml文件中所有元素的xpath?

如何在具有默认名称空间的xml文档上使用XPath

解析包含默认名称空间的xml以使用lxml获取元素值

如何使用XPath根据条件获取XML containsg默认名称空间中的特定元素

使用XmlDocument从具有或不具有名称空间的xml文件读取

使用nokogiri(带有名称空间)从xml文件读取数据

使用C#在属性级别读取具有名称空间的XML

使用groovy XMLParser读取名称空间/ SOAP响应中的xml值

项目的默认XML名称空间必须是MSBuild XML名称空间

Visual Studio 2015错误。项目的默认XML名称空间必须是MSBuild XML名称空间

禁用默认名称空间

解析XML文件时如何处理默认名称空间

是否添加了空的默认XML名称空间xmlns =“”属性?

使用XSLT使用名称空间转换xml

使用Karate使用名称空间解析XML

使用PowerShell使用名称空间解析XML

具有显式默认名称空间的XML文档的XPath和名称空间规范

从外壳程序向XML文档的默认名称空间的标签添加名称空间前缀。