2010-05-10 2 views
1

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

<?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> 

СА считает, что число ребенка узлов «книги» является 3, они:

  • текстовый узел (содержащий полукокс между <books> и <book>)
  • элемент узла <book>
  • текстовый узел (содержащий полукокс между </book> и </books>)

Вопрос: как я могу сказать LibXML игнорировать пробелы? Я пытался с no_blanks (то есть $ parser = XML :: LibXML-> new (no_blanks => 1) при построении парсера), но кажется, что он не действует.

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

+0

Можете ли вы использовать «s/\ s + $ //;» для удаления всего пробела в конце строки. – Space

+0

К сожалению, я не могу просто слепо удалить эти пробелы из каждой строки, потому что результаты могут быть недействительными в соответствии с используемым DTD. – Gilbeg

+0

+1 для Giada De Laurentiis (ну и мне нравится вопрос :) – DVK

ответ

2

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

+0

Спасибо за предложение, но это не поможет. Я попробовал это на Linux и Cygwin. – Gilbeg

+0

работал для меня. если я переключу это, текстовые узлы, содержащие CR, исчезнут. – kdubs

1

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

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

$books = $document->documentElement(); 

Это возвращает экземпляр XML::LibXML::Element. Исходя из этого, вы можете получить только <book> детей-элементов с использованием getChildrenByTagName():

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

ли эта помощь?

+0

Привет, Я в значительной степени сделал то, что вы упомянули. В версии фрагмента это $ dom = XML :: LibXML-> load_xml (location => "books.xml"); $ dom-> validate(); $ root = $ dom-> documentElement(); @x = $ root-> childNodes; Размер @X равен 3. Кажется, что LibXML сломан. Проверка валидатора() Проверяет dom на DTD. Я знаю это, потому что, если я поменяю другой титул и авторизуюсь, парсер жалуется. Однако анализатор не смог понять из DTD, что ребенок книг может быть только заголовком, автором, годом и ценой, вообще не PCDATA. Итак, откуда этот текстовый вывод? – Gilbeg

Смежные вопросы