从SOAP消息中检索Xpath

时间:2011-07-07 11:09:38

标签: java xml soap

我想在运行时从soap消息中检索所有xpath。

例如,如果我有像

这样的肥皂消息
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Bodyxmlns:ns1="http://xmlns.oracle.com/TestAppln_jws/TestEmail/TestEmail">
 <ns1:process>
          <ns1:To></ns1:To>
          <ns1:Subject></ns1:Subject>
          <ns1:Body></ns1:Body>
        </ns1:process>
    </soap:Body>
</soap:Envelope>

然后来自此soap消息的可能的xpath是

  1. /soap:Envelope/soap:Body/ns1:process/ns1:To
  2. /soap:Envelope/soap:Body/ns1:process/ns1:Subject
  3. /soap:Envelope/soap:Body/ns1:process/ns1:Body
  4. 我如何用java来回复那些?

2 个答案:

答案 0 :(得分:2)

XPath类型与NamespaceContext一起使用。

Map<String, String> map = new HashMap<String, String>();
map.put("foo", "http://xmlns.oracle.com/TestAppln_jws/TestEmail/TestEmail");
NamespaceContext context = ...; //TODO: context from map
XPath xpath = ...; //TODO: create instance from factory
xpath.setNamespaceContext(context);

Document doc = ...; //TODO: parse XML
String toValue = xpath.evaluate("//foo:To", doc);

双正斜杠使此表达式与给定节点中To中的第一个http://xmlns.oracle.com/TestAppln_jws/TestEmail/TestEmail元素匹配。我使用foo而不是ns1并不重要;前缀映射需要匹配XPath表达式中的那个,而不是文档中的那个。

您可以在Java: using XPath with namespaces and implementing NamespaceContext中找到更多示例。您可以找到使用SOAP here的更多示例。

答案 1 :(得分:0)

这样的事情可行:

string[] paths;
function RecurseThroughRequest(string request, string[] paths, string currentPath)
{
    Nodes[] nodes = getNodesAtPath(request, currentPath); 
    //getNodesAtPath is an assumed function which returns a set of 
    //Node objects representing all the nodes that are children at the current path

    foreach(Node n in nodes)
    {
        if(!n.hasChildren())
        {
            paths.Add(currentPath + "/" + n.Name);
        }
        else
        {
            RecurseThroughRequest(paths, currentPath + "/" + n.Name);
        }

    }
}

然后使用以下内容调用该函数:

string[] paths = new string[];
RecurseThroughRequest(request, paths, "/");

当然,这不会有用,但我认为理论是存在的。