XML :: Простое игнорирование тега emdash? - PullRequest
3 голосов
/ 21 ноября 2010

Я использую XML Simple для анализа XML-файла, проблемная часть выглядит так:

    <textBody>
        <title>
            <titlePart>
                <text>SECTION A <emdash/> HUMAN NECESSITIES</text>
            </titlePart>
        </title>
    </textBody>
    <ipcEntry kind="t" symbol="A01" ipcLevel="C" entryType="K" lang="EN">
        <textBody>
            <title>
                <titlePart>
                    <text>AGRICULTURE</text>
                </titlePart>
            </title>
        </textBody>
    </ipcEntry

почему-то XML :: Simple полностью игнорирует <text>SECTION A <emdash/> HUMAN NECESSITIES</text> Я думаю, это потому, что тег emdash, потому что <text>AGRICULTURE</text> разбирается просто отлично. Я также попытался установить парсер:

$XML::Simple::PREFERRED_PARSER = 'XML::Parser';

до сих пор нет. Есть идеи?

Ответы [ 2 ]

5 голосов
/ 21 ноября 2010

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

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

Вам нужно будет выбрать другой модуль XML. XML :: LibXML и XML :: Twig являются популярными вариантами.

Другая возможность состоит в том, чтобы заставить любого, кто произвел XML, использовать сущности вместо тегов для представления символов, таких как тире. Например, XML :: Simple может обрабатывать:

<text>SECTION A &#8212; HUMAN NECESSITIES</text>

просто отлично. (&#8212; - это тире.)

4 голосов
/ 21 ноября 2010

XML::Simple анализирует все это, но не очень хорошо обрабатывает смешанный контент, из подробного руководства :

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

Например, это:

use Data::Dumper;
use XML::Simple;
print Dumper(XMLin(qq{
    <textBody>
        <title>
            <titlePart>
                <text>SECTION A <emdash/> HUMAN NECESSITIES</text>
            </titlePart>
        </title>
    </textBody>
}));

Урожайность:

$VAR1 = {
    'title' => { 
        'titlePart' => { 
            'text' => { 
                'emdash' => {}, 
                'content' => [ 
                    'SECTION A ', 
                    ' HUMAN NECESSITIES'
                ]
            }
        }   
    }
};

Итак, эмдаш есть, но смешанный контент довольно запутан.

...