2010-07-21 2 views

ответ

6

Существует нет простого метода для org.w3c.dom.Node для этого. getTextContent() передает текст каждого дочернего узла, объединенного вместе. getNodeValue() предоставит вам текст текущего узла, если это атрибут, CDATA или текстовый узел. Таким образом, вам потребуется сериализовать узел, используя комбинацию getChildNodes(), getNodeName() и getNodeValue() для построения строки.

Вы также можете сделать это с помощью одной из существующих XML-сериализационных библиотек. Существует XStream или даже JAXB. Это обсуждается в XML serialization in Java?

36

Такая же проблема. Чтобы решить эту проблему, я написал эту вспомогательную функцию:

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    NodeList childNodes = node.getChildNodes(); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < childNodes.getLength(); i++) { 
     sb.append(lsSerializer.writeToString(childNodes.item(i))); 
    } 
    return sb.toString(); 
} 
+0

спасибо, именно то, что мне нужно – yossi

+0

Этот метод продолжает добавлять тег определения XML в передней части колонны ... есть ли способ, чтобы предотвратить что, кроме того, просто обрезая его потом? – Nyerguds

+16

Я решил. Решением этого является добавление строки 'lsSerializer.getDomConfig(). SetParameter (" xml-declaration ", false);' – Nyerguds

2

Если вы не хотите прибегать к внешним библиотекам, следующее решение может пригодиться. Если у вас есть узел «», и вы хотите, чтобы извлечь Childre родительского элемента действуйте следующим образом:

StringBuilder resultBuilder = new StringBuilder(); 
    // Get all children of the given parent node 
    NodeList children = parent.getChildNodes(); 
    try { 

     // Set up the output transformer 
     TransformerFactory transfac = TransformerFactory.newInstance(); 
     Transformer trans = transfac.newTransformer(); 
     trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StringWriter stringWriter = new StringWriter(); 
     StreamResult streamResult = new StreamResult(stringWriter); 

     for (int index = 0; index < children.getLength(); index++) { 
      Node child = children.item(index); 

      // Print the DOM node 
      DOMSource source = new DOMSource(child); 
      trans.transform(source, streamResult); 
      // Append child to end result 
      resultBuilder.append(stringWriter.toString()); 
     } 
    } catch (TransformerException e) { 
     //Errro handling goes here 
    } 
    return resultBuilder.toString(); 
4

Если вы используете jOOX, вы можете обернуть узел в jquery -как синтаксиса и просто вызов toString() на нем:

$(node).toString(); 

Он использует идентификационную-трансформатор внутренне, например:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
Source source = new DOMSource(element); 
Result target = new StreamResult(out); 
transformer.transform(source, target); 
return out.toString(); 
0

здание на вершине Lukas Эдер» s решение, мы можем извлечь InnerXml как в .NET, как показано ниже

public static String innerXml(Node node,String tag){ 
     String xmlstring = toString(node); 
     xmlstring = xmlstring.replaceFirst("<[/]?"+tag+">",""); 
     return xmlstring;  

}

public static String toString(Node node){  
    String xmlString = ""; 
    Transformer transformer; 
    try { 
     transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StreamResult result = new StreamResult(new StringWriter()); 

     xmlString = nodeToStream(node, transformer, result); 

    } catch (TransformerConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } 

    return xmlString;    
} 

Ex:

If Node name points to xml with string representation "<Name><em>Chris</em>tian<em>Bale</em></Name>" 
String innerXml = innerXml(name,"Name"); //returns "<em>Chris</em>tian<em>Bale</em>" 
1

У меня была проблема с последним ответом, что метод «nodeToStream () 'не определено; поэтому, моя версия здесь:

public static String toString(Node node){ 
    String xmlString = ""; 
    try { 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     //transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

     Source source = new DOMSource(node); 

     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 

     transformer.transform(source, result); 
     xmlString = sw.toString(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return xmlString; 
} 
3

Продолжая ответ Андрея М, мне пришлось слегка изменить код, чтобы получить полный документ DOM. Если вы просто используете

NodeList childNodes = node.getChildNodes(); 

Он не содержит элемент корня для меня. Для того, чтобы включать в себя корневой элемент (и получить полный XML-документ) Я использовал:

public String innerXml(Node node) { 
    DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 
    LSSerializer lsSerializer = lsImpl.createLSSerializer(); 
    lsSerializer.getDomConfig().setParameter("xml-declaration", false); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(lsSerializer.writeToString(node)); 
    return sb.toString(); 
} 
0

Вот является альтернативным решением для извлечения содержимого org.w3c.dom.Node. Это решение работает также, если узел содержимого не содержит XML-теги:

private static String innerXml(Node node) throws TransformerFactoryConfigurationError, TransformerException { 
    StringWriter writer = new StringWriter(); 
    String xml = null; 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    transformer.transform(new DOMSource(node), new StreamResult(writer)); 
    // now remove the outer tag.... 
    xml = writer.toString(); 
    xml = xml.substring(xml.indexOf(">") + 1, xml.lastIndexOf("</")); 
    return xml; 
} 
Смежные вопросы