Когда ты сказал
contentNode.selectSingleNode("./text")
это, конечно, возвращает узел элемента <text>
; но когда вы затем попросите
.text
свойства, вы запрашиваете текстовое содержимое всего элемента <text>
, которое представляет собой конкатенацию значений всех его дочерних текстовых узлов.
Если вы хотите выбрать один текстовый узел, попробуйте
contentNode.selectSingleNode("./text/text()[1]").text;
т.е. выберите первый дочерний текстовый узел элемента <text>
, затем извлеките его свойство text. Это должно дать вам "<P align=center> </P> <P align=center>"
(как неразобранный текст, а не дерево XML) в вашем примере.
Чтобы отличить CDATA от не-CDATA, вам придется обойти XPath, который не предназначен для их различения. С другой стороны, XML DOM может, по крайней мере, в некоторых реализациях. Итак, вы можете попробовать
var children = contentNode.selectNodes("./text/node()");
который выберет nodeList
всех дочерних элементов элемента <text>
, включая текстовые узлы, узлы элементов и, возможно, узлы CDATA. Переберите узлы в children
и проверьте их свойство nodeType
, чтобы увидеть, является ли оно NODE_CDATA_SECTION
, NODE_TEXT
или чем-то другим.
Дайте нам знать, как это происходит, и нужна ли вам дополнительная помощь.
Редактировать
Исходя из того, что вы приняли этот ответ, я предполагаю, что вы смогли заставить все работать, и я рад, что вы смогли.
Тем не менее, я не хочу упускать это из виду, не подчеркнув предостережение, на которое намекал @choroba: оболочка CDATA (вокруг фрагмента текста) невидима для большинства инструментов XML (хотя текстовое содержимое видно). Модель данных XML (неформально описанная здесь) ничего не знает о разделах CDATA. Стандарт для XML Infoset явно опускает информацию о границах разделов, помеченных CDATA.
Таким образом, хотя на этот раз вам «повезло» в том, что вы использовали XML DOM, который действительно предоставляет информацию о разделах CDATA, это противоречит духу XML (и, следовательно, неразумно) полагаться на эту информацию для кодирования важных данных в XML. По этой причине вам было бы полезно закодировать эту информацию каким-либо другим способом. В противном случае, если вам когда-нибудь понадобится использовать другие XML-инструменты для данных, вы можете застрять.
Я думаю, что важной информацией, которую вы пытаетесь здесь извлечь, является тот факт, что текст в разделах CDATA является экранированной разметкой. Например. это части тегов HTML, которые не должны быть (или не могут быть) частью дерева XML. Таким образом, вы можете закодировать эту идентификацию, окружив каждую из них пользовательским элементом:
<text>
<escaped><![CDATA[<P align=center> </P>
<P align=center>]]></escaped>
<media identifier="005896523">
...
Затем, чтобы найти эти разделы в будущем, все, что вам нужно сделать, это найти элементы с именем <escaped>
, что является простой и естественной задачей для любого XML-инструмента.
Я не знаю, находится ли дизайн этих файлов XML под вашим контролем или нет. Если нет, у вас, по крайней мере, должна быть возможность отправить отзыв дизайнеру. Если дизайнер, не очень хорошо разбирающийся в XML-вещах, допускает ошибку проектирования, в его интересах узнать об этом, чтобы иметь возможность исправить ее или, по крайней мере, избежать той же ошибки в будущих проектах. Если вы работаете по цепочке подчинения, а разработчик XML находится в другом отделе, правильный путь для обратной связи может быть через вашего руководителя. В интересах отдела знать, производят ли они непереносимые проекты XML.
person
LarsH
schedule
09.10.2012
(./text/text())[1]
,(./text/text())[2]
и т. д.? - person choroba   schedule 09.10.2012