3

<data>以下の XML の例で、要素の値を取得するにはどうすればよいですか? この場合、XML パーサーが node の値を文字列として返すようにしたいと思います。

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

(つまり、XML フラグメント)。

XML::SimpleObjectPerl ( ) または 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 仕様のすべての複雑さに対処できます。XML::TwigXML::LibXML

このソリューションは を使用し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のcElementTreelibを使用します。

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]: 

注:Python2.7を使用している場合。次に、xmlノードの属性のdictを取得し、そのテールを取得するために、 さらに多くのlist(elem)代わりにelem.getchildren()使用できます。http://docs.python.org/2/library/xml.etree.elementtree.htmlpage.iter()page.getiterator()
elem.attrbelem.tail

于 2012-12-15T04:32:01.637 に答える
0

内部要素は完全に有効な XML であるため、XML パーサーはもちろん内部要素を「飲み込んでいます」。

また:

  1. エンコードされた XML を修正します。HTML タグがドキュメント構造の一部であると想定されていない場合は、適切にエンコードする必要があります。
  2. 目的のルート ノードを見つけ XML を再シリアル化してテキストを生成します。
于 2012-12-15T02:32:32.783 に答える