XML :: Простые и пространства имен - PullRequest
0 голосов
/ 09 января 2020

ПРИМЕЧАНИЕ: Проблема решена, но, пожалуйста, прочитайте ответ Икегами ниже. Потрясающе информативно, особенно ссылка об избежании XML :: Simple.

Я только начал работать с корпорацией, которая широко использует XML :: Simple, и теперь у нас возникают проблемы с синтаксическим анализом.

Вот пример XML файла ... (обратите внимание, первая часть закомментирована)

<xyz:CostFee>
        <ec:OPA>25.00</ec:OPA>
        <ec:CTID>278421</ec:CTID>
        <xyz:CDEPSID>82</xyz:CDEPSID>
        <ec:IID>8765654</ec:IID>
</xyz:CostFee>

Я использую этот простой perl скрипт ....

#!/usr/bin/perl

use XML::Simple;
use Data::Dumper;

my $content = XMLin('./data.xml');
print Dumper($content);

Запуск сценария дает это .....

Undeclared prefix: xyz at /System/Library/Perl/Extras/5.18/XML/NamespaceSupport.pm line 298.
XML::Simple called at ./xml_test.pl line 6.

Когда я использую это в XML файле ...

<catalog>
        <part partnum="184324" desc="Desc 1" price="19.00" />
        <part partnum="765398" desc="Desc 2" price="18.00" />
        <part partnum="878998" desc="Desc 3" price="15.00"/>
</catalog>

Он работает просто отлично, и Dumper с радостью сбрасывает все это .....

Поскольку речь идет об устаревшей программе, замена XML :: Simple не нужна (но, честно говоря, я не думаю, что вы можете зарегистрировать пространство имен в XML :: Просто, но я ни в коем случае не эксперт).

Может кто-нибудь указать мне правильное направление указателем или двумя? Я думаю, что включение информации о пространстве имен в состав XML может быть способом к go, что-то вроде ......

<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3.org/1999/XSL/Transform">

Большое спасибо JW

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Узел должен быть дочерним по отношению к узлу со следующим атрибутом:

xmlns:xyz="..."

(Столько, сколько вы должны избегать XML :: Simple , изменение парсера isn не будет работать, если у вас недопустимый XML.)

Например, изменение

<doc>
   <xyz:CostFee>
      <ec:OPA>25.00</ec:OPA>
      <ec:CTID>278421</ec:CID>
      <xyz:CDEPSID>82</xyz:CDEPSID>
      <ec:IID>8765654</ec:IID>
   </xyz:CostFee>
</doc>

на

<doc xmlns:xyz="..." xmlns:ec="...">
   <xyz:CostFee>
      <ec:OPA>25.00</ec:OPA>
      <ec:CTID>278421</ec:CTID>
      <xyz:CDEPSID>82</xyz:CDEPSID>
      <ec:IID>8765654</ec:IID>
   </xyz:CostFee>
</doc>

позволяет анализировать документ. (Обратите внимание на добавление объявлений префикса, а также изменение с </ec:CTID> на </ec:CID>. Используйте правильные URN вместо ....)

1 голос
/ 09 января 2020

Исправлено в одну строку .... просто установите

$XML::Simple::PREFERRED_PARSER = "XML::Parser".

перед вызовом XMLin.

...