3

我正在使用 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';

还是不行。任何的想法?

4

2 回答 2

5

拥有一个标签,其值包含文本和其他标签,称为“混合内容”。 XML::Simple不处理混合内容(无论如何都没有用处)。在 XML::Simple 的全域视图中,标签可以包含文本或其他标签,不能同时包含两者。这就是为什么它被称为“简单”。引用其文档

混合内容(包含文本内容和嵌套元素的元素)将不会以有用的方式表示 - 元素顺序和重要的空白将丢失。如果您需要处理混合内容,那么 XML::Simple 不适合您的工作

您必须选择不同的 XML 模块。 XML::LibXMLXML::Twig是流行的选择。

另一种可能性是让生成 XML 的人使用实体而不是标签来表示像破折号这样的字符。例如,XML::Simple 可以处理:

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

正好。(&#8212;是一个破折号。)

于 2010-11-21T08:28:18.910 回答
4

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'
                ]
            }
        }   
    }
};

所以 emdash 在那里,但混合的内容相当混乱。

于 2010-11-21T08:36:40.343 回答