2012-12-15 249 views
3

在下面的XML示例中,如何獲取<data>元素的值?在這種情況下,我想XML解析器返回節點的值作爲應該返回獲取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> 

回答

0

XML分析器是當然的「吞嚥」內部元件的文本值,因爲它們是完全有效的XML。

或者:

  1. 修正編碼XML - 如果HTML標籤不應該是文檔結構的一部分,他們應該進行適當的編碼。
  2. 找到你想要的根節點,然後重新串行化 XML來生成文本。
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; 
+0

$節點[0] - >的textContent不包括在結果中的XML。 – ddoxey

+1

哎呀,誤讀的問題。 – ikegami

+0

看起來像OP想要用於XML解析的「innerHTML」。 – ddoxey

0

蟒使用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

3

XML::Simple 模塊是完全簡單,留下了大量的工作由程序員來完成。我還沒有試過 XML::SimpleObject 但我會鼓勵你使用任何 XML::TwigXML::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>