如何使用JAVA从XML获取特定的整个标签值

时间:2018-12-06 11:36:06

标签: java xml

我尝试下面的代码从XML文件中获取特定的整个标签值

XML结构:

<?xml version="1.0" encoding="UTF-8"?>
    <test-result>
    <test-method status="PASS" name="beforeTestSetup" is-config="true" duration-ms="705" started-at="2018-08-16T21:39:59Z" finished-at="2018-08-16T21:39:59Z">
    <params>
    <param index="0">
    <value> <![CDATA[org.testng.TestRunner@31c2affc]]> </value>
    </param>
    </params>   
    </test-method>
    <test-method status="FAIL" name="beforeTestSetup" is-config="true" duration-ms="805" started-at="2018-08-16T21:39:59Z" finished-at="2018-08-16T21:39:59Z">
    <params>
    <param index="0">
    <value> <![CDATA[org.testng.TestRunner@31c2affc]]> </value>
    </param>
    </params>   
    </test-method>
    <test-method status="PASS" name="TEST" is-config="true" duration-ms="905" started-at="2018-08-16T21:39:59Z" finished-at="2018-08-16T21:39:59Z">
    <params>
    <param index="0">
    <value> <![CDATA[org.testng.TestRunner@31c2affc]]> </value>
    </param>
    </params>   
    </test-method>      
    </test-result>

代码:

   docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   is = new InputSource();
   is.setCharacterStream(new StringReader(content));
   doc = docBuilder.parse(is);
   NodeList rootElement = doc.getElementsByTagName("test-method");
   for (int i = 0; i < rootElement.getLength(); i++) 
    {
      Element element=(Element)rootElement.item(i);
       if(element.getAttribute("status").equals("PASS"))
       {
          System.out.println(element.getTextContent());
       }
    }

上面的代码无法正常工作。

我只想只获取test-method status =“ pass”并跳过此有效负载中的其余内容。预期的输出如下:

预期的输出(它应该获取整个标记及其值):

 <test-method status="PASS" name="beforeTestSetup" is-config="true" duration-ms="705" started-at="2018-08-16T21:39:59Z" finished-at="2018-08-16T21:39:59Z">
     <params>
     <param index="0">
     <value> <![CDATA[org.testng.TestRunner@31c2affc]]> </value>
     </param>
     </params>  
     </test-method>
     <test-method status="PASS" name="TEST" is-config="true" duration-ms="905" started-at="2018-08-16T21:39:59Z" finished-at="2018-08-16T21:39:59Z">
     <params>
     <param index="0">
     <value> <![CDATA[org.testng.TestRunner@31c2affc]]> </value>
     </param>
     </params>  
     </test-method>

以上结果应跳过“失败”状态的结果。

有人帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

对于这种情况,请考虑改用XSLT。带有身份转换的XSLT样式表,以及对选定元素的特殊处理,效果很好。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="test-method[@status = 'FAIL']"/>
</xsl:stylesheet>

第一个模板匹配所有类型的节点,创建该节点的副本,然后将模板递归应用于子节点。

第二个模板将匹配每个具有名为test-method且属性值为status的{​​{1}}元素。由于此模板不执行任何操作,因此FAIL元素和所有子节点将被过滤掉。

这是一个完整的例子:

test-method

答案 1 :(得分:0)

您好,通过替换

尝试使用此功能
System.out.println(element.getTextContent());

System.out.println(description(element, ""));

public  String description(Node n, String tab){
        String str = new String();
        if(n instanceof Element){
            Element element = (Element)n;
            str += "<" + n.getNodeName();
            if(n.getAttributes() != null && n.getAttributes().getLength() > 0){
                NamedNodeMap att = n.getAttributes();
                int nbAtt = att.getLength();
                for(int j = 0; j < nbAtt; j++){
                    Node noeud = att.item(j);
                    str += " " + noeud.getNodeName() + "=\"" + noeud.getNodeValue() + "\" ";
                }
            }
            str += ">";
            if(n.getTextContent()!= null ){
                str += "<![CDATA[" + n.getTextContent().replace("\n", "").trim()+ "]]";
            }
            if(n.getChildNodes().getLength() == 1)
                str += n.getTextContent();
            int nbChild = n.getChildNodes().getLength();
            NodeList list = n.getChildNodes();
            String tab2 = tab + "\t";
            for(int i = 0; i < nbChild; i++){
                Node n2 = list.item(i);
                if (n2 instanceof Element){

                    str += "\n " + tab2 + description(n2, tab2);
                }
            }
            if(n.getChildNodes().getLength() < 2)
                str += "</" + n.getNodeName() + ">";
            else
                str += "\n" + tab +"</" + n.getNodeName() + ">";
        }
        return str;
    }