【问题标题】:XML::LibXML issue finding XML nodes with a namespace查找具有命名空间的 XML 节点的 XML::LibXML 问题
【发布时间】:2020-05-13 01:40:15
【问题描述】:

我正在编写 XML 解析器,但处理链接的程序有问题。我正在尝试解析 XML 层次结构设置/设置,然后查找节点“值”。以下是 XML 的示例:

<?xml version='1.0' ?>
<Settings xmlns='http://hme.com/Settings.xsd'>
  <Setting SID="0">
    <Name>Store ID</Name>
    <Value>72</Value>
  </Setting>
  <Setting SID="1">
    <Name>Deprecated</Name>
    <Value>0</Value>
  </Setting>
  <Setting SID="8">
    <Name>Open Store Hours Sunday</Name>
    <Value>25200</Value>
  </Setting>

这是我用来解析 XML 的代码

my $doc = $parser->parse_file($settings_file) or die "Couldn't parse timer settings\n";

#Sunday
for my $reviewer ($doc->findnodes('/Settings/Setting[@SID="8"]')) {
  my ($name) = $reviewer->findnodes('Value');
  $name->removeChildNodes();
  $name->appendText('109800');
}

当我从 XML 文件中删除 xmlns='http://hme.com/Settings.xsd' 时,替换值节点没有问题。一旦我在 XML 中输入链接,代码就会停止工作并且不会更新 xml 表。有没有办法处理此链接或将其删除,以便我可以正确更新文件?

【问题讨论】:

  • 您可能会发现我的教程中的“Working with namespaces”部分很有用。
  • 查看您建议的页面,我相信我正在声明命名空间 correcr,但收到的是 XPath error: Undefined namespace prefix。我使用了 xpath 沙箱,并且能够加载我的 xml 并使用查询来查找节点,但是当我尝试在我的代码中没有运气时。这就是我声明命名空间my $xpc = XML::LibXML::XPathContext-&gt;new(); $xpc-&gt;registerNs('xsd', 'http://hme.com/Settings.xsd');的方式

标签: xml perl url xml-parsing xml-libxml


【解决方案1】:

您要求查找名称空间为 null 且名称为 Settings 的节点。文档中没有这样的节点,所以findnodes 正确地没有返回任何内容。

您想查找名称空间为http://hme.com/Settings.xsd 和名称为Settings 的节点。您可以使用以下方法来实现:

my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs( s => 'http://hme.com/Settings.xsd' );

for ($xpc->findnodes('/s:Settings/s:Setting[@SID="8"]'), $doc) {
   ...
}

【讨论】:

    【解决方案2】:

    我能够使用此代码来完成这项工作。

    my $dom = XML::LibXML->load_xml(location => $filename);
    
    my $xpc = XML::LibXML::XPathContext->new($dom);
    $xpc->registerNs('xsd',  'http://hme.com/Settings.xsd');
    
    my($match1) = $xpc->findnodes('//xsd:Settings/xsd:Setting[@SID="8"]/xsd:Value');
    $match1->removeChildNodes();
    $match1->appendText('23400');
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多