xml 名称空间未在 perl 中解析
xml with namespace not getting parsed in perl
我有一个 xml,默认命名空间是这样的:
<?xml version="1.0" encoding="utf-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://127.0.0.1 GrammarXSD.xsd" version="01.00" xmlns="GrammarXSD.xsd">
<DataModel>
#rest of the xml
</DataModel>
</start>
为了解析此 xml,我正在尝试使用以下代码注册命名空间:
my $file = "xml file location";
my $dom = XML::LibXML->load_xml(location => $file);
my $xpc = XML::LibXML::XPathContext->new($dom->documentElement());
$xpc->registerNs('ns', 'GrammarXSD.xsd');
my $b = $dom->findnodes('//ns:DataModel');
但是,这并没有按预期找到 DataModel 节点。
GrammarXSD.xsd 文件与 xml.
文件位于同一位置
我在这里错过了什么?
您必须使用 XPathContext 对象以命名空间感知的方式搜索节点:
my $data_models = $xpc->findnodes('//ns:DataModel', $dom);
顺便说一句,不要使用 my $b
,$b 是在 sort 中使用的特殊变量,如果稍后在相同的中使用 sort
,将其声明为词法可能会导致错误范围。
此外,名称空间 URI 没有任何意义,它只是标识名称空间。
我有一个 xml,默认命名空间是这样的:
<?xml version="1.0" encoding="utf-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://127.0.0.1 GrammarXSD.xsd" version="01.00" xmlns="GrammarXSD.xsd">
<DataModel>
#rest of the xml
</DataModel>
</start>
为了解析此 xml,我正在尝试使用以下代码注册命名空间:
my $file = "xml file location";
my $dom = XML::LibXML->load_xml(location => $file);
my $xpc = XML::LibXML::XPathContext->new($dom->documentElement());
$xpc->registerNs('ns', 'GrammarXSD.xsd');
my $b = $dom->findnodes('//ns:DataModel');
但是,这并没有按预期找到 DataModel 节点。 GrammarXSD.xsd 文件与 xml.
文件位于同一位置我在这里错过了什么?
您必须使用 XPathContext 对象以命名空间感知的方式搜索节点:
my $data_models = $xpc->findnodes('//ns:DataModel', $dom);
顺便说一句,不要使用 my $b
,$b 是在 sort 中使用的特殊变量,如果稍后在相同的中使用 sort
,将其声明为词法可能会导致错误范围。
此外,名称空间 URI 没有任何意义,它只是标识名称空间。