0

私はxmlファイル「SavedWSDL.txt」を使用していますが、その一部を以下に示します...

  ...
<wsdl:message name="LookUpTransactionResponse">
<wsdl:part name="LookUpTransactionReturn" type="impl:ArrayOf_xsd_anyType"/>
</wsdl:message>
<wsdl:message name="LookUpTransactionRequest"></wsdl:message>
<wsdl:message name="creditResponse">
<wsdl:part name="creditReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="creditRequest">
<wsdl:part name="amount" type="xsd:float"/>
<wsdl:part name="password" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="debitRequest">
<wsdl:part name="amount" type="xsd:float"/>
<wsdl:part name="password" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="debitResponse">
<wsdl:part name="debitReturn" type="xsd:int"/>
</wsdl:message>
    ...

以下に示す Java コードを作成しました。「debitRequest」という名前の wsdl:message タグの子ノード名を取得するために使用する必要があるもの

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Ex2 {

    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("D:/SavedWSDL.txt");
            doc.getDocumentElement().normalize();

            NodeList nodelist = doc.getElementsByTagName("wsdl:message");
            //System.out.println("No. of Nodes: "+nodelist.getLength());

            for(int i=0;i<nodelist.getLength();i++){
                Node node=nodelist.item(i);
                String valueOfTag=node.getAttributes().getNamedItem("name").getNodeValue();
                if(valueOfTag.equalsIgnoreCase("debitrequest")){
                    if(node.hasChildNodes()){
                        NodeList childNList=node.getChildNodes();
                        //System.out.println("No. of Childs: "+node.getChildNodes().getLength());
                        //System.out.println(node.getAttributes().getNamedItem("name").getNodeValue());
                    }
                    else{
                        System.out.println("NO CHILD FOUND for: "+valueOfTag);
                    }
                }   
            }
        } catch(Exception io) {
            io.printStackTrace();
        } 
    }
    }
4

1 に答える 1

5

指定された XML では、ノード間にテキスト (非表示) があります。

<wsdl:message name="debitRequest"> <-- Text
<wsdl:part name="amount" type="xsd:float"/> <-- Text
<wsdl:part name="password" type="xsd:string"/> <-- Text
</wsdl:message>

debitRequestこれが、名前の付いたノードに 5 つの子 (テキスト、ノード、テキスト、ノード、テキスト)がある理由です。

新しい ChildNode の NodeType は 1 で、Text の NodeType は 3 です。

node.getNodeType() //1 is ChildNode, 3 is Text

したがって、ノードを取得してそのすべての子を取得したい場合は、それをループしてタイプを確認する必要があります。次に、属性を確認できます。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Ex2 {

    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("testxml.xml");
            doc.getDocumentElement().normalize();

            NodeList nodelist = doc.getElementsByTagName("wsdl:message");
            //System.out.println("No. of Nodes: "+nodelist.getLength());

            for(int i=0;i<nodelist.getLength();i++){
                Node node=nodelist.item(i);
                String valueOfTag=node.getAttributes().getNamedItem("name").getNodeValue();
                if(valueOfTag.equalsIgnoreCase("debitrequest")){
                    if(node.hasChildNodes()){
                        NodeList childNList=node.getChildNodes();
                        for(int j = 0; j < childNList.getLength();j++)
                        {
                            Node n = childNList.item(j);
                            if(n.getNodeType() == 1) //NodeType 1 = Next XML Node
                            {
                                String nvalue = n.getAttributes().getNamedItem("name").getNodeValue();
                                System.out.println(nvalue);
                            }
                            /*if(n.getAttributes() != null){
                                String s = n.getAttributes().getNamedItem("name").getNodeValue();
                                System.out.println(s);
                            }*/
                        }
                        System.out.println(childNList.getLength());

                    }
                    else{
                        System.out.println("NO CHILD FOUND for: "+valueOfTag);
                    }
                }   
            }
        } catch(Exception io) {
            io.printStackTrace();
        } 
    }
    }

Node.getAttributes()子をループして、 null の場合はすべてのチェックを取得することもできます。そうでない場合は、"name"in 属性を検索して続行できます。この 2 番目の方法も私のコードに示されていますが、コメントアウトされています。その:if(n.getAttributes() != null){コメント。

于 2013-03-19T15:11:33.527 に答える