XML::LibXML 查找具有命名空间的 XML 个节点时出现问题
XML::LibXML issue finding XML nodes with a namespace
我正在编写 XML 解析器,但在处理 link 的程序时遇到问题。我正在尝试解析 XML 层次结构 Settings/Setting,然后是 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 中输入 link,代码将停止工作并且不会更新 xml sheet。有没有办法处理这个 link 或删除它以便我可以正确更新文件?
您要求查找名称空间为 null 且名称为 Settings
的节点。文档中没有这样的节点,所以 findnodes
正确 returns 没有。
您想查找具有命名空间 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) {
...
}
我能够使用这段代码让它工作。
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');
我正在编写 XML 解析器,但在处理 link 的程序时遇到问题。我正在尝试解析 XML 层次结构 Settings/Setting,然后是 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 中输入 link,代码将停止工作并且不会更新 xml sheet。有没有办法处理这个 link 或删除它以便我可以正确更新文件?
您要求查找名称空间为 null 且名称为 Settings
的节点。文档中没有这样的节点,所以 findnodes
正确 returns 没有。
您想查找具有命名空间 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) {
...
}
我能够使用这段代码让它工作。
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');