【发布时间】:2015-01-23 01:02:45
【问题描述】:
我在尝试强制 XML SOAP 请求的结束标签时遇到问题,因为 Java 会自动生成自结束标签。这会导致包含问题并导致无效的子元素错误。下面显示了用于在 XML 中制作 SOAP 主体的代码。 “请求”中有几个节点没有值,但服务器确实保存了数据。下面显示了我得到的输出和我需要什么。今天是我玩 Java 的第一天,所以请用超级简单的术语解释一下,或者更好的是,显示一个示例代码行。我读了一篇类似标题的帖子,但似乎是用不同的语言写的。感谢您的帮助。
更新:在 w3schools 网站上它声明:
"空 XML 元素 - 可以为没有内容的 XML 元素使用另一种语法:而不是像这样编写 book 元素(没有内容):<book></book> 可以这样写this <book /> 这种元素语法称为自闭合。”
所以,表达我的请求的另一种方式是,如何防止 Java 编译器编译自关闭 XML 元素以避免错误:“Invalid Subelement Worker_Reference-urn:com.workday/bsvc for element Get_Workers_Request (6$16639 )”。我需要指定元素/子节点应该在树中的哪个位置关闭,因为这样可以解决我在其他语言(例如 VB)中复制它时的问题。
//---------------------------------------------------------------------------
//*************** This is the body code *************** ---------------------
//---------------------------------------------------------------------------
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("Get_Workers_Request", "wd", "urn:com.workday/bsvc");
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Request_References", "wd");
SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("Worker_Reference", "wd");
SOAPElement soapBodyElem3 = soapBodyElem.addChildElement("ID", "wd");
soapBodyElem3.setAttribute("wd:type", "Employee_ID");
soapBodyElem3.addTextNode("123");
//---------------------------------------------------------------------------
//*************** This is what I get *************** ------------------------
//---------------------------------------------------------------------------
<SOAP-ENV:Body>
<wd:Get_Workers_Request>
<wd:Request_References/>
<wd:Worker_Reference/>
<wd:ID wd:type="Employee_ID">123</wd:ID>
</wd:Get_Workers_Request>
//----------------------------------------------------------------------------
//*************** This is what I need *************** ------------------------
//----------------------------------------------------------------------------
<SOAP-ENV:Body>
<wd:Get_Workers_Request>
<wd:Request_References>
<wd:Worker_Reference>
<wd:ID wd:type="Employee_ID">123</wd:ID>
</wd:Worker_Reference>
</wd:Request_References>
</wd:Get_Workers_Request>
更新 #2:
这是来自 Microsoft VB 代码的复制和粘贴,其中包含所做的确切更改以及此摘录的结果。缺乏遏制复制了这种失败。
sEnv = sEnv & "<wd:Request_References>"
sEnv = sEnv & "<wd:Worker_Reference>"
sEnv = sEnv & "<wd:ID wd:type=""Employee_ID"">" & sEmployee_ID & "</wd:ID>"
sEnv = sEnv & "</wd:Worker_Reference>"
sEnv = sEnv & "</wd:Request_References>"
'--------------------------
'Returns value - John Smith
'--------------------------
sEnv = sEnv & "<wd:Request_References/>"
sEnv = sEnv & "<wd:Worker_Reference/>"
sEnv = sEnv & "<wd:ID wd:type=""Employee_ID"">" & sEmployee_ID & "</wd:ID>"
'sEnv = sEnv & "</wd:Worker_Reference>"
'sEnv = sEnv & "</wd:Request_References>"
'------------------------------------------------------------------------
'Returns Error - Invalid Subelement ID-urn:com.workday/bsvc for element Get_Workers_Request (6$16639)
'------------------------------------------------------------------------
【问题讨论】:
-
您是否编辑或尝试重新输入“这就是我得到的”XML?你声称得到的和你声称需要的都不是well-formed XML。
-
@kjhughes - 是的,这是我为说明问题而编辑的摘录。 java 编译器会看到任何没有与之关联的值的子节点,并在子节点的末尾附加一个正斜杠。如果我从我的工作 VB 代码中获取一个子条目(例如)并将“/”放在末尾
,它会失败并显示错误“Invalid Subelement ID-urn:com.workday/bsvc for element Get_Workers_Request (6$16639)" 就像现在在 Java 中一样。我需要的是结束标记 被强制以 Java 和适当的位置显示。谢谢 -
在 w3schools 网站上它声明为空 XML 元素 - 可以为没有内容的 XML 元素使用另一种语法:而不是像这样编写 book 元素(没有内容):
可以这样写 这种元素语法称为自闭合。 -
如果您试图避免自闭合元素,您就问错了问题。
<book/>和<book></book>是完全等价的。 XML 处理器将以相同的方式处理它们。请阅读XML with end tag and without it 接受的答案。谢谢。 -
@kjhughes - 我很感谢您的回复。对于一个空的末端叶节点来说,这似乎意味着相同,但是当它与主分支绑定时,它每次都会失败。我有可以在 VB 中运行的工作代码,现在刚刚对其进行了测试。一旦我将
替换为仅 用于空的主分支,它就会失败并显示相同的消息“无效的子元素”。有什么想法吗?