0

プレーンDOMパーサーを使用してJavaでcollada(.dae)ファイルを解析しようとしていました。値を取得しようとすると、nullが返されます。他の議論からの回答や提案を試してみましたが、成功しませんでした。私が使用したコードは以下のとおりです。

for(int k1=0;k1<meshlist.getLength();k1++) {
    Element geometryItr1 = (Element)geometrylist.item(k);

    NodeList trianglelist = geometryItr1.getElementsByTagName("triangles");

    //System.out.println("Triangles length is " + trianglelist.getLength());     

        for(int o=0;o<trianglelist.getLength();o++) {

            Element trichildnodes = (Element) trianglelist.item(o);
            NodeList inputs = trichildnodes.getElementsByTagName("input");
        NodeList p = trichildnodes.getElementsByTagName("p");
        Element ppp = (Element) p.item(0);
        System.out.println("Node Value " + ppp.getNodeValue());
        System.out.println(inputs.getLength() + "Input length");

        for(int in=0;in<inputs.getLength();in++) {

            Element inn = (Element) inputs.item(in);
            System.out.println(inn.getAttribute("semantic") + " " + inn.getAttribute("source") + " Attributes");

        }


        //System.out.println(p.getLength() +  " P's length" );
        //System.out.println("P's content " + ppp.getFirstChild().getNodeValue());


    }   
}

XMLは非常に大きく、解析しようとしていた部分を投稿しています。

<mesh>
  <source> </source>
  <source> </source>
  <source> </source>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  <triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  <triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  <triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  <triangles>
</mesh>

の値を取得しようとしていました<p>。pの値を取得することを除いて、すべてが正常に機能します。しかし、デバッグすると、最初の子に関連付けられている値を確認できます。firstChildを使ってみました。私はこれに関する解決策を見つけようとする構文解析で完全に迷子になっています。pの値を取得する方法に関する解決策を見つけるのを手伝ってください。

代わりにgetTextContentを使用すると、次のような出力が得られます。

NodeValue null
NodeValue 24 262 2 72 72 72 72 2222 8198219
NodeValue null

2つのタグの出力は空白です。

4

3 に答える 3

3

javax.xml.xpathXML ドキュメントの処理を容易にするために、Java SE 5 以降の JDK/JRE で利用可能な APIを使用することをお勧めします。

package forum11688757;

import java.io.File;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new File("src/forum11688757/input.xml"));

        XPathFactory xpf = XPathFactory.newInstance();
        XPath xpath = xpf.newXPath();
        NodeList nodeList = (NodeList) xpath.evaluate("/mesh/triangles/p", document, XPathConstants.NODESET);
        for(int x=0; x<nodeList.getLength(); x++) {
            System.out.println(nodeList.item(x).getTextContent());
        }
    }

}

入力.xml

<mesh>
  <source> </source>
  <source> </source>
  <source> </source>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  </triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  </triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  </triangles>
  <triangles>
    <input />
    <input />
    <input />
    <p> 24 262 2 72 72 72 72 2222 8198219  </p>
  </triangles>
</mesh>

出力

 24 262 2 72 72 72 72 2222 8198219  
 24 262 2 72 72 72 72 2222 8198219  
 24 262 2 72 72 72 72 2222 8198219  
 24 262 2 72 72 72 72 2222 8198219  

アップデート

p次のコード行を使用して要素を取得することもできます。ただし、パスp内の要素だけでなくすべての要素を取得するため、注意が必要です/mesh/triangles/p

NodeList nodeList = document.getElementsByTagName("p");

p次のアプローチでは、要素が後でドキュメントの別の場所に追加された場合でも、常に探しているデータを取得できます。

NodeList nodeList = (NodeList) xpath.evaluate("/mesh/triangles/p", document, XPathConstants.NODESET);
于 2012-07-27T15:21:15.087 に答える
1

必要がない場合は、前のノードを反復処理する必要はありません。たとえば、<p>タグ内のすべてのテキストコンテンツを印刷する方法は次のとおりです。

    File xmlPath = new File("test.xml");

    DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
    fabrique.setCoalescing(true);
    fabrique.setIgnoringElementContentWhitespace(true);

    DocumentBuilder constructeur = fabrique.newDocumentBuilder();

    Document document = constructeur.parse(xmlPath);  
    document.setXmlVersion("1.0");
    Element racine = document.getDocumentElement();
    NodeList liste = racine.getElementsByTagName("p");

    for(int i=0; i<liste.getLength(); i++) {
        Element e = (Element)liste.item(i);  
        System.out.println(e.getFirstChild().getTextContent());
    }

あなたはそれを使って、あなたが私が推測するものを手に入れるために精巧に作ることができます。属性値が必要な場合は、次を使用してくださいe.getAttribute("att_name")

于 2012-07-27T14:23:09.483 に答える
1

nodeValue()はnullとして文書化されていElementます

代わりに、getTextContent()を呼び出すことをお勧めします。ただし、独自の特異性があることに注意してください(ツリーのルートで呼び出すと、ツリー内のすべての要素のテキストが連結されます)。

于 2012-07-27T13:52:14.780 に答える