2010-12-28 1 views
2

У меня вопрос о разборе XML. Я экспериментировал с образцовой программой и немного изменил ее, чтобы попытаться понять, как работает парсинг, я столкнулся с выходом, который я не совсем понимаю, и надеюсь, что некоторые из вас могут пролить свет на то, что может происходить.xerces-c: DOM xml разбор

Это мой XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root xmlns="http://www.test.com"> 
    <ApplicationSettings> 
      <option_a>"10"</option_a> 
      <option_b>"24"</option_b> 
    </ApplicationSettings> 
</root> 

Я вставил отладочные по всей моей программе, чтобы попытаться понять, что происходит, когда функция вызывает такую ​​как getChildNodes() процессы, как это называется. Это выход я получил:

Parsing xml file... 
Processing Root... 
Processing children with getChildNodes()... 
>>>>>>>>>>> Loop child 0: Node name is: #text 
>>>>>>>>>>> Loop child 1: Node name is: ApplicationSettings 
= ApplicationSettings processing children with getChildNodes()... 
***** iter 0 child name is #text 
***** iter 1 child name is option_a 
***** iter 2 child name is #text 
***** iter 3 child name is option_b 
***** iter 4 child name is #text 
>>>>>>>>>>> Loop: 2 Node name is: #text 

С выхода, я могу легко сделать вывод, что правильно разобран мой файл XML. Тем не менее, я заметил, что программа также обнаружила дополнительные узлы с именем #text (распечатано с использованием функции getNodeName()). Мой вопрос в том, что относятся к ним и почему они появляются периодически во всех циклах?

Спасибо!

ответ

3

Эти #text узлы в вашем примере относятся к пробелу между тегами. Например здесь

<root xmlns="http://www.test.com"> 
    <ApplicationSettings> 

есть линия подачи и четыре пробела между ...com"> и <App....

Вы можете попытаться разобрать следующее, чтобы увидеть, что происходит:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root xmlns="http://www.test.com"><ApplicationSettings><option_a>"10"</option_a><option_b>"24"</option_b></ApplicationSettings></root> 
+0

Интересно. У меня было такое чувство, что оно каким-то образом касалось пробелов. Вы знаете, есть ли способ избежать добавления этих пробелов в качестве дочерних узлов, чтобы я мог избежать дополнительных накладных расходов при циклировании? Разбирает единственное решение? – user459811

+0

@ user459811 Я не знаком с ксерами, извините. Вы должны обратиться к документации, чтобы найти что-то вроде «игнорировать пробелы». – khachik

+0

Спасибо, Хачик. Я прибегал к использованию if-conditional для игнорирования пробела, если кому-то интересно: if ((currentNode-> getNodeType() == DOMNode :: TEXT_NODE) ​​|| (currentNode-> getNodeType() == DOMNode :: COMMENT_NODE)) { Продолжать; } – user459811

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