我正在编写一个 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');
}
当我删除
xmlns='http://hme.com/Settings.xsd'
从 XML 文件中,替换值节点没有问题。一旦我在 XML 中输入链接,代码就会停止工作并且不会更新 xml 表。有没有办法处理此链接或将其删除,以便我可以正确更新文件?
最佳答案
您要求查找 namespace 为 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) {
...
}
关于XML::LibXML 问题查找具有命名空间的 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59935217/