1

こんにちは、Perl で LibXML を使用して XML ファイルを解析しています。私が抱えている問題は、末尾の文字 (空白) がテキスト ノードとして扱われることです。たとえば、次のような入力が与えられた場合

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
    <!ELEMENT title  (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT year   (#PCDATA)>
    <!ELEMENT price  (#PCDATA)>
    <!ELEMENT book   (title, author, year, price)>
    <!ELEMENT books  (book*)>
]>
<books>
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
</books>

パーサーは、ノード「books」の子の数が 3 であると考えています。

  • <books>テキスト ノード (との間の文字を含む<book>)
  • の要素ノード<book>
  • </book>テキスト ノード (との間の文字を含む</books>)

質問は、空白を無視するように LibXML に指示するにはどうすればよいですか? no_blanks (つまり、パーサーを構築するときに $parser = XML::LibXML->new(no_blanks => 1) ) を試しましたが、効果がないようです。

前もって感謝します

4

2 に答える 2

2

XML::LibXML::Parser には$parser->keep_blanks(0);. no_blanks の反対を行うことになっています-それが機能するかどうかを確認してください

于 2010-05-10T05:40:01.980 に答える
1

厳密に言えば、XML::LibXML正しいことをしています...要素の子ノード<books>3 つあります。問題は、コンテンツをどのように解析しているか、そしてなぜこれが問題なのかということです。

コンテンツを解析し、結果を に割り当てたと仮定すると、クラス$documentのインスタンスが作成されます。これを使用すると、次を使用して要素をXML::LibXML::Document取得できます。<books>documentElement()

$books = $document->documentElement();

これは のインスタンスを返しますXML::LibXML::Element<book>これから、次を使用して子要素のみを取得できますgetChildrenByTagName()

@book_elements = $books->getChildrenByTagName('book');

これは役に立ちますか?

于 2010-05-10T07:24:59.667 に答える