获取XML元素的值

时间:2012-12-15 02:28:06

标签: python perl

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

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 个答案:

答案 0 :(得分:3)

XML::Simple 模块完全简单,并且程序员需要做很多工作。我没试过 XML::SimpleObject 但我鼓励你使用其中之一 XML::Twig 要么 XML::LibXML, 它们都经过了试验和测试,可以应对完整XML规范的所有复杂性。

此sollution使用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>

答案 1 :(得分: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;

答案 2 :(得分:0)

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

或者:

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

答案 3 :(得分:0)

使用python的cElementTree lib。

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