Как я могу проверить документ XML, который имеет амперсанды внутри любого из элементов, не получая исключения? - PullRequest
1 голос
/ 27 марта 2019

У меня есть нередактируемый XML-файл, в котором есть несколько нежелательных тегов, поэтому я получаю исключение при проверке XML-документа с использованием XML :: Simple.Это ожидается.

my $xml = new XML::Simple(); 
if (eval { $xml->parse("sample.xml") }) {
    print "success!!\n";
} else {
    print "failed!!!\n";
} 

Однако синтаксический анализатор также генерирует исключения для амперсандов внутри URL-адреса в XML-документе.Ожидаемый результат заключается в том, что амперсанды внутри тела XML не должны вызывать ошибку.Как я могу преодолеть это с помощью XML :: Simple или любого другого модуля XML-парсера?Я пробовал XML :: Simple, XML :: LibXML и XML :: Mini :: Document.Ни одному из них не удалось решить проблему с амперсандом.

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

Правильная терминология для того, что вы делаете, проверяет, является ли документ правильно сформированным (соответствует определению XML-документа), а не если он действует (соответствует определению документа XML и определению схемы). Вы можете использовать XML :: LibXML :: Schema для проверки документов.

Тем не менее, похоже, что ваш чек работает правильно. То, что вы предоставляете, не является (правильно сформированным) XML, и анализатор говорит вам об этом.


Это не (правильно сформированный) XML:

<ele url="http://www.example.org/form?foo=bar&moo=mar"/>

Это должно быть

<ele url="http://www.example.org/form?foo=bar&amp;moo=mar"/>

Это не (правильно сформированный) XML:

<ele>http://www.example.org/form?foo=bar&moo=mar</ele>

должно быть

<ele>http://www.example.org/form?foo=bar&amp;moo=mar</ele>
1 голос
/ 27 марта 2019

Вы можете XML :: Liberal , который с радостью примет этот сломанный XML.Это может также сломать ваш XML другими способами, так что покупатель остерегается!

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

Преобразователь может быть простым:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Liberal;

my $parser = XML::Liberal->new('LibXML');
my $doc = $parser->parse_file( 'broken_xml.xml');

print $doc->toString;

Понимать, что это опасное решение, используя модуль, который находится в альфа-состоянии и не былпотрогал в 6 лет.Так что он определенно не может быть использован как часть производственной системы.

Реальное решение состоит в том, чтобы получить ввод в виде реального (правильно сформированного) XML.Это возможно, голые & в URL могут быть заменены либо &amp;, либо ;, но для этого следует использовать инструменты HTML, а не XML.Или позор вашего провайдера посылать вам настоящий XML.

Между тем, XML :: Liberal может быть частью временного решения.

1 голос
/ 27 марта 2019

У вас нет файла XML.Парсер говорит вам, что это не файл XML.Если вы хотите использовать файлы, отличные от XML, не пытайтесь обрабатывать их с помощью инструментов XML.

Если создатель файла заявил, что это был XML, скажите, что он отправил вам неисправный файл, и спроситедля того, чтобы это исправить, или переключиться на более надежного поставщика.(Что бы вы сделали, если бы вы загрузили программу, претендующую на Java, и она не компилировалась?)

0 голосов
/ 27 марта 2019

У меня есть нередактируемый XML-файл

На самом деле нет. У вас нет файла XML. У вас есть что-то, почти, но не совсем, файл XML. Правильно сформированный XML-документ не содержит амперсандов, отличных от тех, которые составляют начало сущности (а это не те). Амперсанд в правильно оформленном XML-документе должен быть закодирован как &amp;.

Полагаю, у вас есть три варианта:

  1. Вернитесь к источнику этого "не-XML" документа и попросите его отправить вам что-то, что является правильно сформированным XML. Если это исходит от внешнего поставщика, вполне возможно, что существуют контракты, в которых говорится, что они предоставят вам XML. Если это так, то они являются нарушением договора.
  2. Предварительный анализ документа для исправления кодировки амперсандов. Это может быть хрупким, и я не рекомендую это.
  3. Используйте что-то вроде XML :: Liberal для разбора документа. Я не рекомендую это, поскольку после того, как вы разрешите нестандартный XML, это скользкий уклон, который приводит к путанице, которую мы видели в HTML-парсерах в 1990-х годах: -)

Если бы это зависело от меня, я бы определенно выбрал первый вариант.

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