как проверить, что элемент XML содержит CDATA?

я разбираю файл XML в java. Как узнать, содержит ли эмелент CDATA или нет? Другими словами, как идентифицировать элементы, содержащие CDATA? Спасибо.

WL


person waqas    schedule 26.01.2012    source источник
comment
Вы имеете в виду <[![CDATA ... ]]> разделов? Обнаружить их невозможно, но, к счастью для вас, в этом нет абсолютно никакой необходимости.   -  person Tomalak    schedule 26.01.2012
comment
Некоторые синтаксические анализаторы раскрывают блоки CDATA (хотя я не мог назвать ни одного из них навскидку)… но, как говорит Томалак, вам никогда не должно быть до этого дела.   -  person Quentin    schedule 26.01.2012
comment
тогда как я могу получить значение этого элемента. с разделом CDATA я могу получить его как nl.item(0).getFirstChild().getNodeValue(). где nl - это список узлов, но я не могу понять, где задействован CDATA. Помогите, пожалуйста   -  person waqas    schedule 26.01.2012
comment
возможный дубликат Определить, имеет ли текстовое содержимое CDATA   -  person McDowell    schedule 26.01.2012
comment
На самом деле я открываю файл xml и при необходимости вношу некоторые изменения, а затем сохраняю его обратно в тот же файл или новый файл. во время синтаксического анализа я могу получить данные даже с использованием CDATA, применив documentBuilderFactory.setCoalescing(true) ко всему файлу, но когда я пишу его обратно, мне нужно знать, какие элементы имели CDATA, чтобы я мог записать файл обратно соответственно. Любые предложения, как это сделать?   -  person waqas    schedule 26.01.2012
comment
@waqas: Почему? Запишите их обратно без CDATA, в чем разница?   -  person Tomalak    schedule 26.01.2012
comment
@Tomalak: Или просто напишите их все с помощью CDATA, это точно ничему не повредит.   -  person josh.trow    schedule 26.01.2012
comment
На самом деле проблема в том, что я использую в нем sql-запросы. И если я использую без cdata, то такие знаки, как ‹ или ›, могут сбить с толку синтаксический анализатор, а синтаксический анализатор может принять его как новый элемент, но на самом деле это больше или меньше, чем для sql-запроса.   -  person waqas    schedule 26.01.2012
comment
@waqas Неправда. Если этот синтаксический анализатор понимает XML, он преобразует &lt; обратно в < перед использованием значения узла, вы даже не заметите.   -  person Tomalak    schedule 26.01.2012
comment
да, но для этого нам нужно использовать < вместо ‹. поэтому мы можем использовать use ‹ с использованием cdata, но не без cdata. так что, если я хочу использовать ‹ напрямую, используя cdata. так что любое предложение, как справиться с этим?   -  person waqas    schedule 26.01.2012
comment
Как вы анализируете свой XML? Возможно, вам поможет мой ответ в другой ветке: stackoverflow.com/a/9000683/1143392. Удачи, Макс   -  person Max    schedule 30.01.2012


Ответы (1)


Вам нужно будет прочитать текст тега, а затем найти, существует ли CDATA в тексте со строкой, содержащей или тому подобное. Вроде как:

String cdata = data.text("xmltag");
cdata.contains("cdata")....
person jasonflaherty    schedule 17.09.2013
comment
Тег cdata опускается при сохранении в базу данных, но содержимое сохраняется. Таким образом, вы не можете проверить, имеет ли строка тег cdata, поскольку она никогда не будет иметь - person HappyLee; 19.06.2015
comment
Проголосовать против? Вопрос не в базе данных, а только в разборе файла. - person jasonflaherty; 19.06.2015
comment
@jasonflaherty Если вы используете синтаксический анализатор XML, такой как DOM, и получаете значение свойства InnerText, вы получаете текст, из которого либо удалены пробелы, либо нет, в зависимости от того, было ли содержимое заключено в раздел CDATA или нет, но вы никогда не узнаете, было ли это потому что вы получаете только содержимое раздела CDATA. Ваш метод работает только в том случае, если вы читаете и анализируете необработанный XML самостоятельно, и немногие люди используют XML таким образом. - person Martin Maat; 20.05.2019