XML::LibXML 问题查找具有命名空间的 XML 节点

标签 xml perl url xml-parsing xml-libxml

我正在编写一个 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/

相关文章:

javascript - 需要 SVG 解决方法

android - 当我最初在 java 或 Kotlin 中设置时,CheckBox 的 isChecked 不起作用

xml - 从 tomcat 服务器上的 jsp 访问 xml 会抛出 FileNotFoundException 试图访问 .keystore?

perl - 很难发现 Perl 脚本中的错误

perl - 设置钻石运算符(operator)在 bin 模式下工作?

laravel - 将页面 URL 参数传递给 Laravel 5.2 中的 Controller

xml - 对 xsl 中的备用表行应用备用类名 :foreach loop

perl - 后缀取消引用 say((\@a)->@*) v5.22

actionscript-3 - 将 AS2 SWF 加载到 AS3 SWF 中并在 URL 中传递变量

ios - NSURL URLWithString :relativeToURL: is clipping relative url