在下面的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>
答案 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。
或者:
答案 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