name
属性の値を一部のXMLデータのsection
要素の値にしようとしています。要素の属性値を取得する
my $some_att = $fileLocation->findnodes("//section[/@name]");
この構文で何が問題なのか説明してください。
ここで変数$fileLocation
は、私が作業しているXMLのファイルの場所を開きます。
name
属性の値を一部のXMLデータのsection
要素の値にしようとしています。要素の属性値を取得する
my $some_att = $fileLocation->findnodes("//section[/@name]");
この構文で何が問題なのか説明してください。
ここで変数$fileLocation
は、私が作業しているXMLのファイルの場所を開きます。
私は使用していると仮定しています 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
オブジェクトのコレクションを、与えるだろう 暴徒の答え
実際、式は構文的には有効ですが、常に空のシーケンスを返します。 –
で説明したようにfindnodes
への呼び出しに私はPerlを知らないが、私はfindnodes()は、XPath式を評価するために設計されていること。仮定しますあなたの表現
"//section[/@name]"
は構文的には正しいものの、意味的にはナンセンスです。 (あなたが理解していない事例から切り取って貼り付けていて、それが実際に何を意味するのかをスペックに戻すことなく、想像することができます。ここ
二つの主要なエラー。あなたには、いくつかの条件を満足するセクションを選択 だが、あなたの散文 要件は、(a)は、あなたが名前(いないセクション)、および を(取得したいと言う:
/@name
は無効です。式の先頭にある '/'はルート(ドキュメント)ノードを選択し、@nameは属性を選択します。ドキュメントノードには属性がないため、何も選択しません。式は//section/@name
です。 (あなたはPerlの空間にそれらを得れば、あなたが名前でやっていることは私の知識の外にある。)
'XML :: LibXML'は' libxml2'のPerlラッパーで、[任意の数の言語バインディングとラッパー](http://xmlsoft.org/python.html)を持っています。もしあなたが言語を問わずライブラリを知っているなら(そしてXMLデータを使って作業しているなら、それを取り除くのは難しいです)、Perlのアイデアやクラスは、あなたがすでによく知っているものを反映するはずです。 – Borodin
マイケルに感謝します。もちろんあなたは正しい。 XSLTエンジンを開発すると、XPathの構文に関する知識が不思議になります。著者の*「誰かがこの構文に間違っていることを説明できますか?」*私は、構文エラーが報告されていると見なしてくれました。 (ところで、私はICL 1904SのパンチカードでAlgol 68と一緒に働いて、Readingで卒業しました!) – Borodin
あなたは 'XMLを使用しています:: LibXML'を? – Borodin
'// section [/ @ name]'は、ヌル名前空間の 'name'という名前の属性を持つルート要素を持つヌル名前空間の' section'要素を意味します。一方、 '// section [@name]'は、ヌル名前空間の 'name'という名前の属性を持つヌル名前空間の' section'要素を意味します。 – ikegami