我目前正在开发对SOAP Web服务的调用,我需要能够动态地在XML文档中添加元素。我尝试使用dom4j库,这在其他情况下运行良好,但我无法使用当前的XML文档来完成它。
我的目标是在<fieldsToNull>fieldname</fieldsToNull>
节点下添加一些<urn:sObjects>
元素。看起来很简单就像这样说但我觉得遗憾的是我在使用XML时遇到了问题
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:partner.soap.sforce.com" xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<urn:SessionHeader>
<urn:sessionId>sessionId</urn:sessionId>
</urn:SessionHeader><urn:AssignmentRuleHeader>
<urn:assignmentRuleId/><urn:useDefaultRule>1</urn:useDefaultRule></urn:AssignmentRuleHeader>
</soapenv:Header>
<soapenv:Body>
<urn:update>
<urn:sObjects>
<type>Account</type>
<Id/>
<Name/>
</urn:sObjects>
</urn:update>
</soapenv:Body>
根据我在某些主题上找到的答案,这是我的最后一次尝试。它不会产生错误但不起作用:
org.dom4j.Document msgDocument = ((routines.system.Document)input_row.Body).getDocument();
org.dom4j.Element root = msgDocument.getRootElement();
String xpathExpression = "Enveloppe.Body.update.Objects";
List<Node> nodes = root.selectNodes(xpathExpression);
for (Node node : nodes) {
Element e = (Element) node;
e.addElement("fieldsToNull").addText("Name");
}
routines.system.Document newMsgDocument = new routines.system.Document();
newMsgDocument.setDocument(msgDocument);
output_row.Body = newMsgDocument;
有没有人可以提示我该如何做?
精确度:我的代码将在Talend作业中设置。它并没有改变它的工作方式,只是说它。
答案 0 :(得分:1)
经过更多的调查后,我终于能够通过以下代码做我想做的事了:
org.dom4j.Document msgDocument = ((routines.system.Document)input_row.Body).getDocument();
Map uris = new HashMap();
uris.put("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
uris.put("urn", "urn:partner.soap.sforce.com");
XPath xpath = msgDocument.createXPath("//soapenv:Body/urn:update/urn:sObjects");
xpath.setNamespaceURIs(uris);
List<Node> nodes = xpath.selectNodes(msgDocument);
for (Node node : nodes) {
Element e = (Element) node;
Element fieldsToNull = e.addElement("fieldsToNull");
fieldsToNull.setText("Name");
System.out.println(fieldsToNull.toString());
}
routines.system.Document newMsgDocument = new routines.system.Document();
newMsgDocument.setDocument(msgDocument);
output_row.Body = newMsgDocument;