Доступ к динамическим вложенным парам значений в XML - PullRequest
1 голос
/ 29 марта 2012

У меня в настоящее время есть CGI-скрипт Perl, который анализирует входящие XML-запросы, используя XML :: Simple .Соглашение входящего 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>

Мне нужно перейти к парам имя / значение, и из соглашения компонент имени равен «CORE», а значением является значение «ID».».Однако проблема заключается в том, что в данном соглашении «CORE» представляет собой изменяющийся список возможных значений.Иными словами, XMLin анализирует этот XML так, что верхним и вторичным «CORE» являются хэши, а затем «ID» и остальные данные в виде массива хэшей.

Я пошел на это с точки зрения использования параметра KeyAttr в XML :: Simple и перечисления всех возможных вариантов 'CORE' для значений, но это список изменений, так что это невозможно.Другой просто использует вложенные операторы Whiles и For для перехода к необходимым компонентам, но это кажется нелогичным.Я начал смотреть на XML :: LibXML, но мне кажется, что это немного сложнее.

Предложения с благодарностью.

1 Ответ

2 голосов
/ 29 марта 2012

Я нахожу XML::Simple более неловким, чем простым, и настоятельно рекомендую перейти на XML :: LibXML или XML :: Twig , если только вы получите доступВыражения XPath для доступа к XML DOM.

Вот некоторый код для выполнения того, что, я думаю, вы хотите с вашим XML.Он находит все элементы на два уровня ниже корневого <XMLRequest> элемента с атрибутом 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');
}

output

CORE => 14
CORE => 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...