Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 如何使用DOM获取具有特定属性的节点数_Java_Dom_Xml Parsing - Fatal编程技术网

Java 如何使用DOM获取具有特定属性的节点数

Java 如何使用DOM获取具有特定属性的节点数,java,dom,xml-parsing,Java,Dom,Xml Parsing,我的任务是在Eclipse中用JDom解析XML文件。当我开始创建代码时,我的代码只足以获得标记名模型的长度(多少)节点。任务更为具体,我需要使用具有属性类型的标记名模型获取节点的长度。我应该如何修改代码以获得结果 这是我的XML文件的一部分 <container> <models> <model id="FM1" type="BoQ"> <meta <phase phaseDesc="PRCR>SLCT

我的任务是在Eclipse中用JDom解析XML文件。当我开始创建代码时,我的代码只足以获得标记名模型的长度(多少)节点。任务更为具体,我需要使用具有属性类型的标记名模型获取节点的长度。我应该如何修改代码以获得结果

这是我的XML文件的一部分

<container>
  <models>
    <model id="FM1" type="BoQ">
      <meta
       <phase phaseDesc="PRCR>SLCT>"/>
    <domain domainCode="SPM.BOQ.RFP "/>
    <levelOfDetail levelOfDetailCode="[4]"/>
  </meta>
</model>

<model id="FM2" type="Object">
  <meta>
    <phase phaseDesc="PRCR>SLCT> "/>
    <domain domainCode="BIM"/>
    <levelOfDetail levelOfDetailCode="[4] "/>
  </meta>
</model>

<model id="FM3">
  <meta>   
    <phase phaseDesc="PRCR>SLCT>"/>
    <domain domainCode="SPM.QTO"/>
    <levelOfDetail levelOfDetailCode="[5]"/>
  </meta>
</model>

<model id="FM4" type="BoQ">
  <meta>   
    <phase phaseDesc="PRCR>SLCT>"/>
    <domain domainCode="TSM.TSC"/>
    <levelOfDetail levelOfDetailCode="[3]"/>
  </meta>
  </model>
 </models>

  <linkModels>
    <linkModel id="LM1" type="QuantitySplit">
  <meta>
    <info>
      <i k="ModelName" v="Linkmodell"/>
    </info>
    <domain domainCode="LKM.QSP" domainDesc="Link Model"/>
  </meta>
  <models>
    <model id="FM1"/>
    <model id="FM2"/>
    <model id="FM3"/>
    <model id="FM4"/>
  </models>

</container>

公共类xmldom{

public static void main(String[] args) {

    Document xmlDoc = getDocument("./src/MMT_Angebot_Anfrage.xml");

    System.out.println("Root: "+ 
            xmlDoc.getDocumentElement().getNodeName());

    NodeList model = xmlDoc.getElementsByTagName("model");



    System.out.println("Number of Models " +
            model.getLength());

    String elementPhase = "phase";
    String elementDomain = "domain";
    String elementLOD = "levelOfDetail";
    String attrPhase = "phaseCode";
    String attrDomain = "domainCode";
    String attrLOD = "levelOfDetailCode";

    getElementAndAttrib(model, elementPhase, elementDomain, elementLOD, attrPhase, attrDomain, attrLOD); 
}

private static Document getDocument(String docString) {

    try {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();

        return builder.parse(new InputSource(docString));

    }

    catch(Exception ex) {

        System.out.println(ex.getMessage());

    }


    return null;
}

private static void getElementAndAttrib(NodeList model,
        String elementPhase, String elementDomain, String elementLOD,
        String attrPhase, String attrDomain, String attrLOD) {

    try {

        for(int i=0; i < model.getLength(); i++){

            Node modelNode = model.item(i);

            Element modelElement = (Element)modelNode;


            NodeList phaseList = modelElement.getElementsByTagName(elementPhase);

            NodeList domainList = modelElement.getElementsByTagName(elementDomain);

            NodeList lodList = modelElement.getElementsByTagName(elementLOD);

            Element phaseElement = (Element)phaseList.item(0);

            Element domainElement = (Element)domainList.item(0);

            Element lodElement = (Element)lodList.item(0);

            NodeList elementList = phaseElement.getChildNodes();


                System.out.println("=================================================");               
                System.out.println(attrPhase + " : "+ phaseElement.getAttribute(attrPhase));
                System.out.println(attrDomain + " : "+ domainElement.getAttribute(attrDomain));
                System.out.println(attrLOD + " : "+ lodElement.getAttribute(attrLOD));

        }
    }

    catch(Exception ex) {

        System.out.println(ex.getMessage());

    }

  }
}
publicstaticvoidmain(字符串[]args){
documentxmldoc=getDocument(“./src/MMT_Angebot_Anfrage.xml”);
System.out.println(“根:”+
xmlDoc.getDocumentElement().getNodeName());
节点列表模型=xmlDoc.getElementsByTagName(“模型”);
System.out.println(“型号数量”+
model.getLength());
String elementPhase=“阶段”;
字符串elementDomain=“domain”;
String elementLOD=“levelOfDetail”;
字符串attrPhase=“phaseCode”;
字符串attrDomain=“domainCode”;
字符串attrLOD=“levelOfDetailCode”;
getElementAndAttrib(模型、elementPhase、elementDomain、elementLOD、attrPhase、attrDomain、attrLOD);
}
私有静态文档getDocument(字符串docString){
试一试{
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
setIgnoringElementContentWhitespace(true);
工厂设置验证(true);
DocumentBuilder=factory.newDocumentBuilder();
返回builder.parse(新的InputSource(docString));
}
捕获(例外情况除外){
System.out.println(例如getMessage());
}
返回null;
}
私有静态void getElementAndAttrib(节点列表模型,
String elementPhase、String elementDomain、String elementLOD、,
字符串属性(相位、字符串属性域、字符串属性LOD){
试一试{
对于(int i=0;i
是否要计算包含type属性的
元素数?如果是,那么XPath是最合适的工具

XPath xp = XPathFactory.newInstance().newXPath();

Double num = xp.evaluate("count(//model[@type])", doc, XPathConstants.NUMBER);

顺便说一句,你使用的是DOM,而不是JDOM。

如果你没有向我们展示你的任何代码,我们怎么能告诉你应该做什么修改呢?啊,是的……你说得对……我已经把代码放好了……非常感谢@四十二,它很有效……你刚刚让我开心了!!。是的,我使用DOM而不是JDOM,谢谢你的更正。