Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要解析xml文件并使用检查空标记打印元素_Xml_Perl_Xml Parsing - Fatal编程技术网

需要解析xml文件并使用检查空标记打印元素

需要解析xml文件并使用检查空标记打印元素,xml,perl,xml-parsing,Xml,Perl,Xml Parsing,我需要编写一个perl脚本来解析XML文件。如果SpecialData标记有值,那么我需要打印名称。我可以写这个 对于以下文件 对于以下xml文件,输出应为名称abc <Data> <Name>abc</Name> <SpecialData>Properties</SpecialData> </Data> <Data> <Name>mnp</Name> </

我需要编写一个perl脚本来解析XML文件。如果SpecialData标记有值,那么我需要打印名称。我可以写这个 对于以下文件

对于以下xml文件,输出应为名称abc

<Data>
    <Name>abc</Name>
    <SpecialData>Properties</SpecialData>
</Data>

<Data>
    <Name>mnp</Name>
</Data>
但在如下所述的xml文件中,SpecialData标记的标记属性为空。如果有SpecialData标记,我需要编写一个perl脚本来打印名称。这里的区别是属性是一个内部标记,而不是第一个问题的值。有人能帮我写一个perl脚本来做这件事吗

对于以下xml文件,输出应为Name-abc

<Data>
    <Name>abc</Name>
    <SpecialData>
      <Properties />
    </SpecialData>
</Data>

<Data>
    <Name>mnp</Name>
</Data>
[您发布的内容不是有效的XML文件。我假设您发布的内容是XML文件的片段。具体来说,我假设它们位于名为root的根元素下。]

使用基于DOM的解析器(如XML::LibXML),它将如下所示:

for my $data_node ($doc->findnodes('/root/Data')) {
   if ($data_node->findnodes('SpecialData')) {
      say $data_node->findvalue('Name');
   }
}
for my $data_node ($doc->findnodes('/root/Data[SpecialData]')) {
   say $data_node->findvalue('Name');
}
say for $doc->findnodes('/root/Data[SpecialData]/Name/text()');
如果您不需要从其他数据节点获取任何信息,甚至可以使用以下功能:

for my $data_node ($doc->findnodes('/root/Data')) {
   if ($data_node->findnodes('SpecialData')) {
      say $data_node->findvalue('Name');
   }
}
for my $data_node ($doc->findnodes('/root/Data[SpecialData]')) {
   say $data_node->findvalue('Name');
}
say for $doc->findnodes('/root/Data[SpecialData]/Name/text()');
如果不需要数据节点的任何其他内容,甚至可以使用以下功能:

for my $data_node ($doc->findnodes('/root/Data')) {
   if ($data_node->findnodes('SpecialData')) {
      say $data_node->findvalue('Name');
   }
}
for my $data_node ($doc->findnodes('/root/Data[SpecialData]')) {
   say $data_node->findvalue('Name');
}
say for $doc->findnodes('/root/Data[SpecialData]/Name/text()');

显示的两个文件都不是有效的XML,因为它们都缺少根元素。在根级别,一个XML文档中不能有多个元素。//你试过自己解决这个问题吗?