XML::简单地忽略emdash标签?

发布于 2024-10-03 23:07:12 字数 907 浏览 2 评论 0 原文

我正在使用 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 完全忽略了 SECTION A >人类必需品 我猜是因为 emdash 标签,因为 AGRICULTURE 解析得很好。 我还尝试通过以下方式设置解析器:

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

仍然不行。 有什么想法吗?

I'm using XML Simple to parse an XML file, the problematic part looks like that:

    <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

for some reason XML::Simple completely ignores <text>SECTION A <emdash/> HUMAN NECESSITIES</text>
I guess its because the emdash tag, because <text>AGRICULTURE</text> is parsed just fine.
I also tried setting the parser by:

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

still no go.
Any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

生活了然无味 2024-10-10 23:07:12

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

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

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

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

<text>SECTION A — HUMAN NECESSITIES</text>

就好了。 (是一个破折号。)

Having a tag whose value includes both text and other tags is called "mixed content". XML::Simple doesn't handle mixed content (not usefully, anyway). In XML::Simple's view of the universe, a tag can contain either text or other tags, not both. That's why it's called "Simple". To quote its docs:

Mixed content (elements which contain both text content and nested elements) will be not be represented in a useful way - element order and significant whitespace will be lost. If you need to work with mixed content, then XML::Simple is not the right tool for your job

You'll have to pick a different XML module. XML::LibXML and XML::Twig are popular choices.

Another possibility would be to get whoever produced the XML to use entities instead of tags to represent characters like a dash. For example, XML::Simple could handle:

<text>SECTION A — HUMAN NECESSITIES</text>

just fine. ( is an em dash.)

So尛奶瓶 2024-10-10 23:07:12

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>
}));

Yields:

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

所以破折号在那里,但混合内容相当混乱。

XML::Simple is parsing it all but it doesn't handle mixed content that well, from the fine manual:

Mixed content (elements which contain both text content and nested elements) will be not
be represented in a useful way - element order and significant whitespace will be lost.
If you need to work with mixed content, then XML::Simple is not the right tool for your
job - check out the next section.

For example, this:

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

Yields:

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

So the emdash is there but the mixed content is rather mixed up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文