3

在下面的 XML 示例中,如何获取<data>元素的值?在这种情况下,我希望 XML 解析器将节点的值作为应该返回的字符串返回

This is my first web page<br/><p>test123</p><p>How exciting</p>

(即一个 XML 片段)。

我一直在尝试使用 Perl ( XML::SimpleObject) 或 Python ( miniDOM)。它们都只能返回<data>元素的文本值,即"This is my first web page"

<dataset>
<data>
This is my first web page<br/>
<p>test123</p>
<p>How exciting</p>
</data>
</dataset>
4

4 回答 4

3

这个 XML::Simple 模块简单了,给程序员留下了很多工作要做。我没有尝试过 XML::SimpleObject ,但我鼓励您使用 XML::Twig or XML::LibXML,它们都经过尝试和测试,可以应对完整 XML 规范的所有复杂性。

此解决方案使用XML::Twig并简单地解析数据、查找<data>元素并打印其内容。

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new;
$twig->parse(\*DATA);

my ($data) = $twig->get_xpath('/dataset/data');
print $data->xml_string;

__DATA__
<dataset>
<data>
This is my first web page<br/>
<p>test123</p>
<p>How exciting</p>
</data>
</dataset>

输出

This is my first web page<br/><p>test123</p><p>How exciting</p>
于 2012-12-15T04:42:42.140 回答
2

这是一个快速的XML::LibXML解决方案。

#!/usr/bin/perl -Tw

use strict;
use warnings;
use XML::LibXML;

my $dom = XML::LibXML->load_xml(string => <<'EOT');
<dataset>
<data>
This is my first web page<br/>
<p>test123</p>
<p>How exciting</p>
</data>
</dataset>
EOT

my @nodes = $dom->findnodes('/dataset/data');

my $xml_text = $nodes[0]->serialize();

# strip <data> and </data> if you don't want them
$xml_text =~ s{(?: \A <data> | </data> \z )}{}xmsg;

print $xml_text;
于 2012-12-15T04:10:05.623 回答
0

使用 python 的 cElementTree 库。

In [23]: import xml.etree.cElementTree as et

In [24]: myxml="""<dataset>
    ...: <data>
    ...: This is my first web page<br/>
    ...: <p>test123</p>
    ...: <p>How exciting</p>
    ...: </data>
    ...: </dataset>"""

In [25]: page = et.fromstring(myxml)

In [26]: for elem in page.getiterator():
    ...:     if elem.tag=='data':
    ...:         print elem.tag, elem.text
    ...:         for tags in elem.getchildren():
    ...:             print tags.tag, tags.text
    ...:             
data 
This is my first web page
br None
p test123
p How exciting

In [27]: 

注意:如果您使用的是 python 2.7;然后使用list(elem)代替elem.getchildren()page.iter()不是page.getiterator()
更多,你可以做更多的事情elem.attrb来获取xml节点属性的字典并elem.tail获取它的尾巴;http://docs.python.org/2/library/xml.etree.elementtree.html

于 2012-12-15T04:32:01.637 回答
0

XML 解析器当然会“吞噬”内部元素,因为它们是完全有效的 XML。

任何一个:

  1. 修复编码的 XML - 如果 HTML 标记不应该是文档结构的一部分,则应该对它们进行适当的编码。
  2. 找到您想要的根节点,然后重新序列化 XML 以生成文本。
于 2012-12-15T02:32:32.783 回答