2017-11-02 21 views
-1

name属性の値を一部のXMLデータのsection要素の値にしようとしています。要素の属性値を取得する

my $some_att = $fileLocation->findnodes("//section[/@name]"); 

この構文で何が問題なのか説明してください。

ここで変数$fileLocationは、私が作業しているXMLのファイルの場所を開きます。

+0

あなたは 'XMLを使用しています:: LibXML'を? – Borodin

+0

'// section [/ @ name]'は、ヌル名前空間の 'name'という名前の属性を持つルート要素を持つヌル名前空間の' section'要素を意味します。一方、 '// section [@name]'は、ヌル名前空間の 'name'という名前の属性を持つヌル名前空間の' section'要素を意味します。 – ikegami

答えて

2

私は使用していると仮定しています XML::LibXML

使用しているツール(ライブラリ、言語、オペレーティングシステム)、および表示されている誤った動作について説明することは非常に重要です。

"ここで変数$fileLocationは、私が働いているXMLのファイルの場所を開きます。"が問題になります。あまり意味をなさない(変数で何も開くことができません)、あなたが選択した識別子はXMLファイルへのパスであることを意味します。 しかし、findnodesを呼び出すには、DOMオブジェクト、具体的にはXML::LibXML::Nodeのインスタンスまたはサブクラスでなければなりません。

あなたのコードをよりこの

use XML::LibXML; 

my $xml_file = '/path/to/file.xml'; 

my $dom = XML::LibXML->load_xml(
    location => $xml_file 
); 

my @sections = $dom->findnodes('//section'); 

for my $section (@sections) { 
    next unless $section->hasAttribute('name'); 
    say $section->getAttribute('name'); 
} 

のようにスカラーコンテキストでfindnodes方法の結果は、単一の XML::LibXML::Node オブジェクトではありませんが、それはbahavesようにオーバーロードされている代わりに XML::LibXML::NodeList、 になります配列への参照と同様に

あなたは何のエラーが発生しているのかはわかりませんが、から「これで間違っていることを教えてもらえますか? yntax? "私はモジュールがあなたのXPath式を拒否していると思いますか?このステートメントで

my $some_att = $fileLocation->findnodes("//section[/@name]") 

問題は、それが正しかった場合、唯一のname属性を有するものが含まれるようにsection要素をフィルタリングします述語[/@name]です。それは軸を必要としない述語であり、従って//section[@name]

のように記述する必要がありますしかし、それは唯一のname属性を持つすべてのsectionの要素がありますので。あなたが//section/@nameを記述する必要がある属性そのものを選択するには、この

my $section_names = $fileLocation->findnodes('//section/@name') 

のようなものは、その後、あなたはXML::LibXML::NodeList XML::LibXML::Attr のオブジェクトを持つことになり、あなたは

my @section_names = map { $_->value } $section_names->get_nodelist 
に似たものを使用してその値のリストを抽出することができます

XPath式//sectionを使用して、すべてのsection要素のリストから開始することをお勧めします。それはあなたがあなたが好む場合は、スカラーコンテキストの代わりにリストコンテキストを選択することにより、 XML::LibXML::NodeListオブジェクトの代わりに配列を扱うことを覚えておいてください$elem->getAttribute('name')

使用name要素を抽出することができ、そこから XML::LibXML::Element オブジェクトのコレクションを、与えるだろう 暴徒の答え

+0

実際、式は構文的には有効ですが、常に空のシーケンスを返します。 –

1

で説明したようにfindnodesへの呼び出しに私はPerlを知らないが、私はfindnodes()は、XPath式を評価するために設計されていること。仮定しますあなたの表現

"//section[/@name]" 

は構文的には正しいものの、意味的にはナンセンスです。 (あなたが理解していない事例から切り取って貼り付けていて、それが実際に何を意味するのかをスペックに戻すことなく、想像することができます。ここ

二つの主要なエラー。あなたには、いくつかの条件を満足するセクションを選択 だが、あなたの散文 要件は、(a)は、あなたが名前(いないセクション)、および を(取得したいと言う:

  • はまず、角括弧は、述語またはフィルタを表しb)リストをフィルタリングすることについて何も言わない。
  • 第2に、/@nameは無効です。式の先頭にある '/'はルート(ドキュメント)ノードを選択し、@nameは属性を選択します。ドキュメントノードには属性がないため、何も選択しません。

式は//section/@nameです。 (あなたはPerlの空間にそれらを得れば、あなたが名前でやっていることは私の知識の外にある。)

+0

'XML :: LibXML'は' libxml2'のPerlラッパーで、[任意の数の言語バインディングとラッパー](http://xmlsoft.org/python.html)を持っています。もしあなたが言語を問わずライブラリを知っているなら(そしてXMLデータを使って作業しているなら、それを取り除くのは難しいです)、Perlのアイデアやクラスは、あなたがすでによく知っているものを反映するはずです。 – Borodin

+0

マイケルに感謝します。もちろんあなたは正しい。 XSLTエンジンを開発すると、XPathの構文に関する知識が不思議になります。著者の*「誰かがこの構文に間違っていることを説明できますか?」*私は、構文エラーが報告されていると見なしてくれました。 (ところで、私はICL 1904SのパンチカードでAlgol 68と一緒に働いて、Readingで卒業しました!) – Borodin

関連する問題