Проблема с окончанием строки XML :: LibXML (пробел) - PullRequest
1 голос
/ 10 мая 2010

HI, Я анализирую XML-файл, используя LibXML в Perl. Проблема, которая у меня есть, заключается в том, что конечные символы (пробелы) обрабатываются как текстовый узел. Например, с учетом ввода, подобного следующему

<?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) при построении парсера), но кажется, что это не имеет никакого эффекта.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 10 мая 2010

XML :: LibXML :: Parser имеет $parser->keep_blanks(0);. Это должно сделать противоположность no_blanks - посмотреть, если это работает

1 голос
/ 10 мая 2010

Строго говоря, XML::LibXML делает правильные вещи ... там есть три дочерних узла элемента <books>. Вопрос в том, как вы анализируете контент и почему это проблема?

Предполагая, что вы проанализировали свой контент и присвоили результат $document, теперь у вас есть экземпляр класса XML::LibXML::Document. Используя это, вы можете получить элемент <books>, используя documentElement():

$books = $document->documentElement();

Возвращает экземпляр XML::LibXML::Element. Отсюда вы можете получить только <book> дочерние элементы, используя getChildrenByTagName():

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

Помогает ли это?

...