Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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 - Fatal编程技术网

访问XML中的动态嵌套值对

访问XML中的动态嵌套值对,xml,perl,Xml,Perl,我目前有一个Perl CGI脚本,它使用解析传入的XML请求。传入XML的约定如下: <?xml version="1.0" encoding="utf-8" ?> <XMLRequest> <CORE> <CORE ID="14"> <PARENT_ID>1</PARENT_ID> <CORE_ID>14</CORE_ID> &

我目前有一个Perl CGI脚本,它使用解析传入的XML请求。传入XML的约定如下:

<?xml version="1.0" encoding="utf-8" ?> 
<XMLRequest> 
  <CORE> 
    <CORE ID="14"> 
        <PARENT_ID>1</PARENT_ID> 
        <CORE_ID>14</CORE_ID> 
        <FORM_ID>1423</FORM_ID> 
        <SECURITY_ID>1</SECURITY_ID> 
        <AREA_ID>3</AREA_ID> 
        <SUB_PARENT_ID>1</SUB_PARENT_ID> 
        <SUB_AREA_ID>1</SUB_AREA_ID> 
    </CORE> 
    <CORE ID="15"> 
        <PARENT_ID>1</PARENT_ID> 
        <CORE_ID>15</CORE_ID> 
        <FORM_ID>1424</FORM_ID> 
        <SECURITY_ID>1</SECURITY_ID> 
        <AREA_ID>3</AREA_ID> 
        <SUB_PARENT_ID>1</SUB_PARENT_ID> 
        <SUB_AREA_ID>2</SUB_AREA_ID> 
    </CORE> 
  </CORE> 
</XMLRequest>

1.
14
1423
1.
3.
1.
1.
1.
15
1424
1.
3.
1.
2.
我需要获得名称/值对,根据约定,名称组件是'CORE',值是'ID'的值。然而,挑战在于,在这个惯例中,“核心”代表了一系列可能的价值观。照原样,XMLin解析该XML,以便最上面和第二个“核心”是散列,而“ID”和其余数据则作为散列数组

我从使用XML::Simple的keyatr选项和列出值的“CORE”的所有可能变体的角度进行了讨论,但这是一个不断变化的列表,因此这是不可行的。另一种方法是使用嵌套的Whiles和For语句来深入到所需的组件,但这似乎违反直觉。我开始研究XML::LibXML,但它似乎有点让人望而生畏


非常感谢您的建议。

我发现
XML::Simple
比Simple更难理解,强烈建议您访问XPath表达式,或者仅访问XML DOM

下面是一些代码,我认为您可以对XML执行所需的操作。它在根
元素下两级查找具有
ID
属性的所有元素,并报告该元素的标记名及其
ID
属性值。正如你所看到的,它只在几行中完成

use strict;
use warnings;

use XML::LibXML;

my $xml = XML::LibXML->load_xml(string => <<XML);
<?xml version="1.0" encoding="utf-8" ?> 
<XMLRequest> 
  <CORE> 
    <CORE ID="14"> 
        <PARENT_ID>1</PARENT_ID> 
        <CORE_ID>14</CORE_ID> 
        <FORM_ID>1423</FORM_ID> 
        <SECURITY_ID>1</SECURITY_ID> 
        <AREA_ID>3</AREA_ID> 
        <SUB_PARENT_ID>1</SUB_PARENT_ID> 
        <SUB_AREA_ID>1</SUB_AREA_ID> 
    </CORE> 
    <CORE ID="15"> 
        <PARENT_ID>1</PARENT_ID> 
        <CORE_ID>15</CORE_ID> 
        <FORM_ID>1424</FORM_ID> 
        <SECURITY_ID>1</SECURITY_ID> 
        <AREA_ID>3</AREA_ID> 
        <SUB_PARENT_ID>1</SUB_PARENT_ID> 
        <SUB_AREA_ID>2</SUB_AREA_ID> 
    </CORE> 
  </CORE> 
</XMLRequest>
XML

foreach my $node ($xml->findnodes('/XMLRequest/*/*[@ID]')) {
  printf "%s => %d\n", $node->nodeName, $node->getAttribute('ID');
}

mmm似乎是一个XPath/XQuery作业,看看您的库是否支持XPath表达式,在这种情况下,使用/XMLRequest/CORE/CORE选择核心节点(核心节点的每个核心节点子节点,XMLRequest节点的子节点),请解释您的XML可以如何更改。只是因为
元素可以有不同的标记名吗?外部
元素是否总是与内部元素具有相同的名称?您只是想要每个元素都有一个
ID
属性吗?
CORE => 14
CORE => 15