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>。问题是,你是如何解析内容的,为什么会出现这个问题?

假设您已经解析了内容并将结果分配给$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 回答