Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML解析为某些标记返回null_Java_Xml_Parsing - Fatal编程技术网

Java XML解析为某些标记返回null

Java XML解析为某些标记返回null,java,xml,parsing,Java,Xml,Parsing,我试图解析一些由3ds max和maya生成的xml文件。一切正常,但有些值返回null。例如,下面的concider(collada,扩展名为.dae)由max或maya生成的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&l

我试图解析一些由3ds max和maya生成的xml文件。一切正常,但有些值返回null。例如,下面的concider(collada,扩展名为.dae)由max或maya生成的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>
即使有值,输出的第二行也不显示任何内容。现在,如果我自己编辑该行,那么输出与预期一致,即,输出如下所示,我在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>
上面我已经解释了我面临的问题。可以找到由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();
        }

    }

}
导入java.io.File;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
公共班机{
公共静态void main(字符串args[]){
试一试{
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
Document doc=docBuilder.parse(新文件(“d://tablemaya.dae”);
//规范化文本表示
doc.getDocumentElement().normalize();
System.out.println(“文档的根元素为”+
doc.getDocumentElement().getNodeName());
NodeList listOfPersons=doc.getElementsByTagName(“库几何体”);
int totalPersons=listOfPersons.getLength();
System.out.println(“总人数:“+totalPersons”);
节点firstPersonNode=listOfPersons.item(0);
if(firstPersonNode.getNodeType()==Node.ELEMENT\u节点){
元素firstPersonElement=(元素)firstPersonNode;
//-------
NodeList geometrylist=firstPersonElement.getElementsByTagName(“几何”);
System.out.println(geometrylist.getLength()+“几何体大小”);

对于(int k=0;k我并没有完全深入到您的代码中,但这似乎是一个比您试图保存它的数据类型更重要的问题


因为43543是最大的值,正在丢失。

您的问题是您正在打印第一个节点

ppp.getFirstChild().getNodeValue()
您可以这样尝试:

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

这应该可以解决问题。
getFirstChild
将获取
ppp
中的第一个节点,这可能是一个文本。

这可能是一个Eclipse错误。您的代码似乎正确,我编写了演示来测试输入文件。该程序在Eclipse中运行良好,但当我试图通过
System.out输出
内容时.println()
,第二个
未打印到Eclipse控制台,因为该行的字符太多(超过30K)。请参阅Eclipse bugzilla上的:

我发现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");
}
ie不显示长字符串“*”并覆盖部分 前置输出

史蒂夫


因此,文件被成功读取和处理,目标信息被完全收集,只有输出部分出现故障,但这不取决于您——而且它不会影响程序,因为我不认为您只想在用户眼中打印一行巨大的文本

我无法理解XML源之间的差异。我的意思是,什么你确实是手工编辑的吗?但是你的代码相当模糊。告诉我你是否能够用itThanks重现你的错误,以获得Raffaele的回复。我使用此代码是出于某些原因,对此感到抱歉。我检查了你的代码,它与我遇到的问题相同。我更改了的内容,但我没有得到相应的值s,在更改它时工作,因此您在中插入了随机内容?我的代码与您的实际源代码的行为如何?请注意,我从您提供的URL中获取了内容。它是否引发异常?它打印什么?显然,在我的计算机上,如果它显示索引值,但不打印到控制台,我的程序将按预期工作e、 这是一个简单的Eclipse(或其他IDE)错误。第二个包含太多字符,无法打印到控制台。您可以尝试输出到一个文件,并使用Eclipse以外的文本编辑器打开它,然后查看它是否工作。请注意,如果索引计数为非零,则表示文件内容已成功读取。对于您的代码,这可能是真的,tooI明白了。它是n不要打印,因为正如你所说,这是一个非常大的值。当我将其输出到文本文件时,它工作正常。非常感谢Raffaele。非常感谢。我再次要问你一个问题。我将这些值存储在一个列表中,当我使用substring()时,它工作正常打印值。这是存储的好方法还是应该使用其他数据结构。我不知道从何处构建列表,以及列表包含的内容。是否正在寻找解决Eclipse控制台错误的方法?否。第二个P节点有一个较大的值。我要存储它。我使用列表存储P节点值。它保存在那里。我是ju首先,我想问一下,在下一阶段将使用这些值时,使用列表还是使用任何其他数据结构都是一个好的选择。在内存中保留一个大字符串是绝对不可取的,尤其是在处理不可信的输入时。你永远不知道你的程序将使用哪个Collada文件,想象一下如果它是一个(非常常见)20MB文件(或200MB文件!)。灵活性和简单性之间总是有一个折衷。通常,Collada文件被翻译成一些专有的二进制格式-在运行时加载速度更快。如果你也是这样,你应该放弃你的列表,使用管道样式,其中P内容被立即用于生成输出,然后被discar迪德
ppp.getElementsByTagName("p").getFirstChild().getNodeValue()
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