我尝试下面的代码从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>
以上结果应跳过“失败”状态的结果。
有人帮我解决这个问题
答案 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;
}