получить необработанный текст узла - PullRequest
1 голос
/ 16 января 2012

Как получить значение узла с его дочерними узлами?Например, у меня есть следующий узел, проанализированный в dom Document instance:

<root>
    <ch1>That is a text with <value name="val1">value contents</value></ch1>
</root>

Я выбираю узел ch1, используя xpath.Теперь мне нужно получить его содержимое, все, что содержится между <ch1> и </ch1>, например, That is a text with <value name="val1">value contents</value>.

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 26 января 2012

Вы можете использовать jOOX , чтобы обернуть ваши объекты DOM и получить от него множество служебных функций, например ту, которая вам нужна.В вашем случае это даст нужный вам результат (используя селекторы в стиле css для поиска <ch1/>:

String xml = $(document).find("ch1").content();

или с XPath, как вы делали:

String xml = $(document).xpath("//ch1").content();

Внутренне,jOOX будет использовать преобразователь для генерации этого выхода, как уже упоминали другие

1 голос
/ 17 января 2012

Если это java на стороне сервера (то есть вам не нужно беспокоиться о том, что он работает на других jvm) и вы используете JDK Sun / Oracle, вы можете сделать следующее:

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

...

Node n = ...;
OutputFormat outputFormat = new OutputFormat();
outputFormat.setOmitXMLDeclaration(true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLSerializer ser = new XMLSerializer(baos, outputFormat);
ser.serialize(n);
System.out.println(new String(baos.toByteArray()));

Не забудьте убедиться, что для окончательного преобразования в строку может потребоваться принять параметр кодирования, если проанализированный xml dom имеет свои текстовые узлы в кодировке, отличной от используемой по умолчанию для ваших платформ, или вы получите мусор из-за необычных символов.

0 голосов
/ 16 января 2012

Я нашел следующий фрагмент кода, который использует преобразование, он дает почти то, что я хочу.Можно настроить результат, изменив метод вывода.

public static String serializeDoc(Node doc) {
        StringWriter outText = new StringWriter();
        StreamResult sr = new StreamResult(outText);
        Properties oprops = new Properties();
        oprops.put(OutputKeys.METHOD, "xml");
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = null;
        try {
            t = tf.newTransformer();
            t.setOutputProperties(oprops);
            t.transform(new DOMSource(doc), sr);
        } catch (Exception e) {
            System.out.println(e);
        }
        return outText.toString();
    }
0 голосов
/ 16 января 2012

Насколько я знаю, в Document нет эквивалента innerHTML. DOM предназначен для сокрытия деталей разметки от вас.

Вероятно, вы можете получить желаемый эффект, пройдя дочерние элементы этого узла. Предположим, например, что вы хотите скопировать текст, но замените каждый тег «value» программно предоставленным значением:

HashMap<String, String> values = ...;
StringBuilder str = new StringBuilder();
for(Element child = ch1.getFirstChild; child != null; child = child.getNextSibling()) {
    if(child.getNodeType() == Node.TEXT_NODE) {
        str.append(child.getTextContent());
    } else if(child.getNodeName().equals("value")) {
        str.append(values.get(child.getAttributes().getNamedItem("name").getTextContent()));
    }
}
String output = str.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...