gpt4 book ai didi

java - 使用 XPath Java 解析 SOAP 响应

转载 作者:行者123 更新时间:2023-11-30 02:31:43 25 4
gpt4 key购买 nike

我是 XPath 新手。我有以下 SOAP 响应:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<addParentResponse xmlns="urn:JadeWebServices/NetsuiteCustomer/">
<addParentResult>Organisation xxxxx already exists - use UpdateParent method instead</addParentResult>
</addParentResponse>
</soap:Body>
</soap:Envelope>

任何人都可以给我一些可以读取“addParentResult”值的代码吗?

问候,阿尼类。

最佳答案

以下 xpath 应该给出所需的结果:

/soap:Envelope/soap:Body/parentns:addParentResponse/parentns:addParentResult/text()

我将 parentns 添加到 xpath 的原因是您的 xml 具有 namespace ,并且您的 xpath 处理器应该了解它们。但是addParentResponse没有前缀并且有默认的命名空间。在这种情况下,在 xpath 表达式中添加一个前缀,并在执行此操作之前告诉 xpath 处理器,对于 parentns 前缀,有一个值为 “urn:JadeWebServices/NetsuiteCustomer/”。这是通过 NamespaceContext 完成的.

另外,请务必告诉 DocumentBuilderFactory 它应该使用 setNamespaceAware( true ); 来了解命名空间

Java 代码为:

    try 
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();

Document doc = db.parse( new File( "soapResponse.xml" ) );

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
javax.xml.namespace.NamespaceContext ns = new javax.xml.namespace.NamespaceContext()
{

@Override
public String getNamespaceURI(String prefix)
{
if ( "soap".equals( prefix ) )
{
return "http://schemas.xmlsoap.org/soap/envelope/";
}
else if ( "xsi".equals( prefix ) )
{
return "http://www.w3.org/2001/XMLSchema-instance";
}
else if ( "xsd".equals( prefix ) )
{
return "http://www.w3.org/2001/XMLSchema";
}
else if ( "xml".equals( prefix ) )
{
return javax.xml.XMLConstants.XML_NS_URI;
}
else if ( "parentns".equals( prefix ) )
{
return "urn:JadeWebServices/NetsuiteCustomer/";
}

return javax.xml.XMLConstants.NULL_NS_URI;
}

@Override
public String getPrefix(String namespaceURI)
{
return null;
}

@Override
public Iterator<?> getPrefixes(String namespaceURI)
{
return null;
}

};


xpath.setNamespaceContext(ns);
XPathExpression expr = xpath.compile( "/soap:Envelope/soap:Body/parentns:addParentResponse/parentns:addParentResult/text()" );


Object exprEval = expr.evaluate( doc, XPathConstants.STRING );
if ( exprEval != null )
{
System.out.println( "The text of addParentResult is : " + exprEval );
}
}
catch ( Exception e )
{
e.printStackTrace();
}
}

要测试此代码,请将 xml 放入名为 soapResponse.xml 的文件中,与 java 文件处于同一级别。

System.out.println() 的输出是:

addParentResult 的文本为:组织 xxxxx 已存在 - 请改用 UpdateParent 方法

关于java - 使用 XPath Java 解析 SOAP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44152924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com