0

3dsmaxとmayaによって生成されたいくつかのxmlファイルを解析しようとしました。すべて正常に動作しますが、一部の値はnullを返します。たとえば、maxまたはmayaによって生成された以下の(.dae拡張子の付いたcollada)xmlを検討してください。

  <triangles>
   <p>  234 32 4 23 544 35 43 5 435</p>
  </triangles>
  <triangles>
   <p> 43543 45 34 5 12 34 4 36457 6</p>
  </triangles>
  <triangles>
   <p>2345  325 34 543 5 34 534 5 435</p>
  </triangles>

これで、Javaコードを使用して解析すると(必要に応じて提供します)、

出力は次のとおりです。

p has 234 32 4 23 544 35 43 5 435
p has 
p has 2345  325 34 543 5 34 534 5 435 

出力の2行目は、値があっても何も表示しません。ここで、自分で行を編集すると、出力は期待どおりになります。つまり、出力は次のようになります。ここでは、xmlファイルに独自の値を指定しました。

編集されたxmlは

 <triangles>
   <p>  234 32 4 23 544 35 43 5 435</p>
  </triangles>
  <triangles>
   <p> 28 234  34 32 4 23 4 23 423  43</p>
  </triangles>
  <triangles>
   <p>2345  325 34 543 5 34 534 5 435</p>
  </triangles>

出力は次のとおりです。

p has 234 32 4 23 544 35 43 5 435
p has 28 234  34 32 4 23 4 23 423  43
p has 2345  325 34 543 5 34 534 5 435 

上記で私が直面している問題について説明しました。ここでは、mayaによって生成されたファイルを見つけることができます。私が使用したJavaコードを以下に示します。

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main {

    public static void main(String args[]) {        

        try {

            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse (new File("d://tablemaya.dae"));

            // normalize text representation
            doc.getDocumentElement ().normalize ();
            System.out.println ("Root element of the doc is " + 
                 doc.getDocumentElement().getNodeName());


            NodeList listOfPersons = doc.getElementsByTagName("library_geometries");
            int totalPersons = listOfPersons.getLength();
            System.out.println("Total no of people : " + totalPersons);
            Node firstPersonNode = listOfPersons.item(0);
            if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){


                Element firstPersonElement = (Element)firstPersonNode;

                //-------
                NodeList geometrylist = firstPersonElement.getElementsByTagName("geometry");
                System.out.println(geometrylist.getLength() + " Geometry size");
                for(int k=0;k<geometrylist.getLength();k++) {
                    Element geometryItr = (Element)geometrylist.item(k);

                    NodeList meshlist = geometryItr.getElementsByTagName("mesh");

                    System.out.println("Mesh length is " + meshlist.getLength());


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

                        NodeList meshlist1 = geometryItr1.getElementsByTagName("source");

                        System.out.println("Source length is " + meshlist1.getLength());                        
                    }
                    for(int k2=0;k2<meshlist.getLength();k2++) {
                        Element geometryItr1 = (Element)meshlist.item(k2);

                        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");
                            //System.out.println("Fucking Problem " + p.item(0).getFirstChild().getNodeValue());
                            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");

                            }

                            for(int i=0; i<p.getLength(); i++) {
                                Element e = (Element)p.item(i);  
                                String ss = e.getFirstChild().getTextContent();
                                System.out.println("Noide is " + ss);
                            }
                            //System.out.println(p.getLength() +  " P's length" );
                            //System.out.println("P's content " + ppp.getFirstChild().getNodeValue());


                        }


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

                        NodeList meshlist1 = geometryItr1.getElementsByTagName("vertices");

                        System.out.println("Vertices length is " + meshlist1.getLength());                      
                    }


                }

            }


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

    }

}

のすべての内容を取得できません<p>。私のコードまたはxmlの問題は何ですか?誰かがこの点で私を助けてください。私の質問を読んでくれてありがとう。

ビナイ

4

3 に答える 3

1

問題は、最初のノードを印刷していることです。

ppp.getFirstChild().getNodeValue()

あなたはこのように試すことができます:

ppp.getElementsByTagName("p").getFirstChild().getNodeValue()

これで問題は解決するはずです。はgetFirstChild、内部の最初のノードを取得しpppます。これはテキストである可能性があります。

于 2012-07-28T08:28:45.330 に答える
1

Eclipseのバグである可能性があります。あなたのコードは正しいようです、そして私は入力ファイルをテストするために私自身のXPathデモを書きました。プログラムはEclipseで正常に実行されますが、<p>を介してコンテンツを出力しようとすると、行の文字数が多すぎる(30Kを超える)ため、System.out.println()2番目のコンテンツがEclipseコンソールに出力されません。Eclipseのbugzillaに関するこのコメント<p>を参照してください。

長い行を印刷すると、Macのコンソールで奇妙なことが起こります。例:

public static void main(String[] args)
{
    System.out.print("Counting");
    StringBuffer buffer = new StringBuffer();
    for (int i=0; i<28504; i++)
    {
        buffer.append("*");
    }
    System.out.print(" some more");
    System.out.println(buffer);
    System.out.println("Complete");
}

これから得られる出力は次のとおりです。

Counting some
Complete

つまり、「*」の長い文字列は表示されず、前の出力の一部を上書きします

スティーブ

したがって、ファイルは正常に読み取られて処理され、ターゲット情報は完全に収集され、出力部分のみが失敗しますが、それはあなた次第ではありません-そして、あなたが望むのは印刷することだけではないと思うので、それはプログラムに影響を与えませんユーザーの目には巨大なテキスト行

于 2012-07-28T10:58:15.623 に答える
0

私はあなたのコードを完全に掘り下げませんでしたが、これはあなたがそれを保持しようとしているデータ型よりも大きな値の問題のようです.

43543 が最大の値であるため、見逃しています。

于 2012-07-28T08:25:30.763 に答える