当前位置: 首页 > 知识库问答 >
问题:

无法获取xml文件中name=“debitrequest”的父节点的子节点名

习淇
2023-03-14

我使用的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代码,应该用什么来获取wsdl的子节点名:消息标记名为“debitrequest”

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();
        } 
    }
    }

共有1个答案

苗征
2023-03-14

在给定的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个子节点(Text,Node,Text,Node,Text)的原因

新的ChildNode的NodeType是1,Text的NodeType是3:

因此,在拥有节点并且希望获得它的所有子节点之后,应该循环它并检查类型。然后您可以检查属性。

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,您还可以循环您的childs并对其进行检查。如果不是,您可以在属性中搜索“name”并继续。第二种方式也显示在我的代码中,但注释掉了。它是:if(n.getAttributes()!=null){注释。

 类似资料:
  • 在将此标记为重复之前,我已经搜索并尝试了在SO上找到的其他解决方案,它们是: 刮擦css选择器:获取所有内部标记的文本 如果子节点是Scrapy中其他节点的父节点,则如何使用XPath从子节点获取文本 Scrapy获取包括子级在内的整个文本 我要从中提取的HTML是: 我想获取//span[@class='location']中的所有文本。 我试过: 全部只回,不回完整地址。 编辑:文本应产生 文

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 在本章中,将学习如何获取XML DOM对象的节点值。 XML文档具有称为节点的信息单元的层次结构。 对象有一个属性 - ,它返回元素的值。 在以下部分中,将讨论学习 - 获取元素的节点值 获取节点的属性值 以下所有示例中使用的node.xml如下所示 - 1. 获取节点值 使用方法以文档顺序返回具有给定标记名称的所有元素的。 示例 以下示例(getnode example.html)将XML文档(