2012-01-15 11 views
1

子ノードでノード値を取得する方法は?例えば私は、DOM Documentインスタンスに解析されたノードを次た:ノードの生のテキストを取得

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

Iは、XPathを使用して、CH1のノードを選択します。今、私はそのコンテンツを入手する必要があります。<ch1></ch1>の間に含まれるものすべてを取得する必要があります。 That is a text with <value name="val1">value contents</value>

私はそれをどのように行うことができますか?

答えて

0

:あなたがテキストをコピーすること、たとえば仮定しますが、プログラムで指定された値と、各「値」タグを置き換えます。出力方法を変更して結果を調整することは可能です。これは、サーバサイドJava(つまり、あなたはそれが他のJVMの上で実行して心配する必要はありません)であり、あなたは、Sun/OracleのJDKを使用している場合は、次の操作を行うことができます

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

私が知る限り、innerHTMLに相当するものはDocumentにありません。 DOMはマークアップの詳細を隠すためのものです。

おそらく、そのノードの子を経由することで、効果を得ることができます。私は、変換を使用して、次のコードスニペットを発見した、それは私が望むものをほぼ正確に与え

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(); 
1

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に、プラットフォームのデフォルトとは異なるエンコーディングのテキストノードがある場合、または文字化けしたxml domが異常な文字にガベージを取得する場合、stringへの究極の変換を確実に行う必要があるかもしれません。

1

jOOXを使用すると、DOMオブジェクトをラップして、必要なものなど多くのユーティリティ関数を取得できます。あなたのケースでは、これはあなたが<ch1/>を見つけるために、CSSスタイルのセレクターを使用して(必要に結果生成されます。

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

かのXPathとあなたが行ったように:内部

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

を、jOOXはに変圧器を使用します。その出力を他の人が述べたように生成する

関連する問題