как получить значение CDATA в JDOM2

Я пытаюсь получить значение CDATA в JDOM2 с помощью getText(), но получаю только следующее:
<![CDATA[ ]]>

Мой XML выглядит следующим образом

<ROOT>
 <CHILD>
    <P><![CDATA[<ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>]]></P>
 </CHILD>
</ROOT>

CDATA содержит XML-контент, который мне нужен в виде строки для его хранения, код elsewejhere (фрагмент) выглядит следующим образом:

XPathFactory xpfac = XPathFactory.instance();
XPathExpression<Element> xElements = xpfac.compile(sXpath,Filters.element(),null,Namespace.getNamespace("myns", "http://www.namespace.com/ns"));
List<Element> elements = xElements.evaluate(doc);       
for (Element xElem : elements) {
    if(!isCDATA)
    {
        sRetval=xElem.getValue();
    }
    else
    {
        sRetval=xElem.getText();
    }
    return sRetval;
}

getValue() работает нормально, тогда как getText() возвращает только <![CDATA[ ]]>

конечно, мой XPAHT выглядит так //ROOT/CHILD/P Любая идея, как я могу получить содержимое CDATA?

Изменить: если я заменяю <P><![CDATA[ SOMECONTENT]]></P>, я получаю "SOMECONTENT". Поэтому я не могу получить содержимое XML из CDATA.


person KK99    schedule 14.04.2013    source источник
comment
Зачем извлекать text узла CDATA? Кажется, что должно быть достаточно просто получить text или value содержащего тега <P>.   -  person millimoose    schedule 14.04.2013
comment
И если getValue() работает нормально, почему бы просто не использовать его?   -  person millimoose    schedule 14.04.2013
comment
getValue() возвращает не все cdata, а только содержимое TEXT из CDATA (без тегов ‹ELEMENT›) Мин. мой случай   -  person KK99    schedule 15.04.2013


Ответы (1)


Я пытался воспроизвести вашу проблему, но не могу ..... (опубликовано как ответ для правильного форматирования)....

public static void main(String[] args) throws JDOMException, IOException {
    final String xml = "<ROOT>\n <CHILD>\n    <P><![CDATA[<ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>]]></P>\n </CHILD>\n</ROOT>";

    Document doc = new SAXBuilder().build(new StringReader(xml));
    XPathFactory fac = XPathFactory.instance();
    XPathExpression<Element> ex = fac.compile("//ROOT/CHILD/P", Filters.element());
    for (Element e : ex.evaluate(doc)) {
        System.out.printf("getValue() %s\n", e.getValue());
        System.out.printf("getText() %s\n", e.getText());
    }
}

производит:

getValue() <ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>
getText() <ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>

Что я делаю по-другому для вас?

person rolfl    schedule 15.04.2013
comment
Спасибо за публикацию ответа. Когда я делаю getValue(), я получаю текстовое содержимое из внутреннего xml без узлов. Например, я получаю SOMECONTENT, а не <ELEMENT>SOMECONTENT</ELEMENT>. После 2 дней борьбы с этим я начал изучать другие методы, но тщетно. Я использую JDOM 2.0.4. Разница, которую я вижу в своем коде, заключается в том, что у меня есть объявление пространства имен, а у вас нет, но я не думаю, что это имеет значение, потому что я получаю только текстовое содержимое, когда я использую getValue() Я получаю некоторый контент, но не весь (сами элементы ) e.getText() возвращает мне это <![CDATA[]]> - person KK99; 15.04.2013
comment
Итак, разница в том, что входной XML, входной XPath и пространства имен отличаются от того, что вы разместили здесь... это не маленькая проблема. Пожалуйста, обновите свой вопрос, чтобы отразить реальное состояние вашей проблемы. Также желательно опубликовать проблему на JDOM GitHub github.com/hunterhacker/jdom/issues/new с более реалистичным представлением вашей проблемы. Я планировал выпустить JDOM 2.0.5 сегодня, но если у вас есть реальная проблема, я отложу ее до тех пор, пока она не будет решена. - person rolfl; 15.04.2013
comment
Спасибо @rolfl, я создал задачу ([ссылка]github.com/hunterhacker/jdom/issues/ 117), но без образца XML, так как я должен думать о данных в нем. В худшем случае мне нужно подготовить XML. Как я уже упоминал здесь, я могу без проблем получить содержимое CDATA на С# с помощью System.XML. Пожалуйста, скажите мне, если вам нужна дополнительная информация - person KK99; 15.04.2013
comment
Привет @rolfl Я разместил пример исходного кода, который может воспроизвести поведение проблемы в github github. com/hunterhacker/jdom/issues/117 - person KK99; 27.05.2013
comment
Я добавил комментарий к той же проблеме. Основная проблема заключается в том, что процесс преобразования добавляет специальные инструкции обработки преобразования к XML-выводу преобразования, а JDOM использует эти специальные инструкции для вывода XML. Эти инструкции по умолчанию делают выходной XML из JDOM отличным от выходного XML из преобразования, что, в свою очередь, приводит к путанице. - person rolfl; 27.05.2013