XMLFile中的PERL XML :: LibXML问题解析链接

问题描述 投票:0回答:1

我正在编写XML解析器,并且处理链接的程序有问题。我正在尝试解析XML层次结构设置/设置,然后解析findnode'Value'。以下是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工作表。有没有办法处理此链接或删除它,以便我可以正确地更新文件?

xml perl url xml-parsing xml-libxml
1个回答
0
投票

您要求查找名称空间为空且名称为Settings的节点。文档中没有此类节点,因此findnodes正确不返回任何内容。

您想找到名称空间为http://hme.com/Settings.xsd且名称为Settings的节点。您可以使用以下方法实现这一目标:

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

for ($doc->findnodes('/s:Settings/s:Setting[@SID="8"]')) {
   ...
}
© www.soinside.com 2019 - 2024. All rights reserved.