我正在使用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';
仍然没有去。 有什么想法吗?
答案 0 :(得分:5)
标记的值包括文本和其他标记,称为“混合内容”。 XML::Simple不处理混合内容(无论如何都没有用)。在XML :: Simple的Universe视图中,标记可以包含文本或其他标记,而不是两者。这就是为什么它被称为“简单”。引用its docs:
混合内容(包含文本内容和嵌套元素的元素)将不会以有用的方式表示 - 元素顺序和重要的空白将丢失。如果您需要使用混合内容,那么XML :: Simple不适合您的工作
您必须选择不同的XML模块。 XML::LibXML和XML::Twig是受欢迎的选择。
另一种可能性是让生成XML的人使用实体而不是标签来表示像破折号这样的字符。例如,XML :: Simple可以处理:
<text>SECTION A — HUMAN NECESSITIES</text>
很好。 (—
是一个短划线。)
答案 1 :(得分:4)
XML::Simple
正在解析它,但它不能处理来自fine manual的混合内容:
混合内容(包含文本内容和嵌套元素的元素)将不会 以有用的方式表示 - 元素顺序和重要的空白将丢失。 如果您需要使用混合内容,那么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就在那里,但混合内容相当混乱。