在 Java 中指定一个 XML 结束标记(对于空元素它会自动 <Self-Closes/>) - 或 - 在指定的 parent 分支下包含 child 节点的语法?
Specify an XML Closing tag in Java (it auto <Self-Closes/> for empty elements) -or- Syntax to contain child nodes under specified parent branches?
我在尝试强制关闭 XML SOAP 请求的标记时遇到问题,因为 Java 是 auto-generating self-closing 标记。这会导致包含问题并导致无效 sub-element 错误。下面显示了用于在 XML 中制作 SOAP body 的代码。 "request" 中有几个节点没有值,但服务器确实保存了数据。下面显示了我得到的输出和我需要的。今天是我第一天玩 Java 所以请用超级简单的术语或更好的方式解释,显示示例代码行。我读了一篇标题相似的文章 post 但似乎使用的是另一种语言。感谢您的帮助。
更新:在 w3schools 网站上声明:
"空 XML 元素 - 另一种语法可用于 XML 没有内容的元素:而不是写一个 book 元素(没有content) 像这样: <book></book>
可以这样写 <book />
这种元素语法叫做 self-closing."
因此,表达我的请求的另一种方式是,如何防止 Java 编译器编译 self-closing XML 元素以避免错误:"Invalid Subelement Worker_Reference-urn:com.workday/bsvc for element Get_Workers_Request (6639)"。我需要指定元素 / child 节点应该在树中的哪个位置关闭,因为这解决了我用其他语言(例如 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 (6639)
'------------------------------------------------------------------------
如何强制 XML 有结束标签?
你不知道。
您误解了错误。 与自闭标签无关 <e></e>
和<e/>
在[=65=中完全等价]. XML 处理者将以相同方式处理每种形式。一种形式不会出错,而另一种则不会。如果一个是对的,那么他们都是对的。另见
而是着眼于您正在组装的元素的实际组成。您的错误消息为您指明了正确的方向:
Invalid Subelement xxxxxx for element Get_Workers_Request (6639)
您在 Get_Workers_Request
中添加了一个 xxxxxx
,而您不应该这样做。 (顺便说一句,你到底为什么要屏蔽这个名字?)除了有用的验证消息,检查定义预期结构的架构 Get_Workers_Request
以获得进一步的指导。
关于更新#2
在您的更新 #2 代码中,这两个构造的请求甚至不等同,它们根本不支持您的说法,即您的问题源于 <e></e>
和 [=12] 之间的差异=]:
- 在有效的那个中,
wd:Request_References
包含
wd:Worker_Reference
.
- 在失败的
wd:Request_References
之前
wd:Worker_Reference
.
即使您从这个答案中没有学到任何其他东西,如果您根据元素包含[=进行思考、编码和调试,您也会领先53=] 而不是 结束标签 .
你说 "it" returns 错误 Invalid Subelement ID-urn:com.workday/bsvc for element Get_Workers_Request (6639)
。但是 "it" 是什么?在我看来,它像是某种过程,正在根据某种模式验证您生成的 XML。在不知道这个验证器是什么或模式是什么的情况下,很难说得更具体,但我认为你几乎肯定是在咆哮错误的树,因为它想象它是由使用自闭标签引起的。
我想当我在上面尝试的最后一个回复中提到它时,我错过了一个要参考的数字。对于任何苦苦挣扎的人……这就是解决问题的方法。通过引用 soapBodyElem1
和 2,它将结束标记移到了我需要的地方。他们不再在同一行上自行关闭标签,而是将需要的元素封装在它们下面。
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 = soapBodyElem1.addChildElement("Worker_Reference", "wd");
SOAPElement soapBodyElem3 = soapBodyElem2.addChildElement("ID", "wd");
soapBodyElem3.setAttribute("wd:type", "Employee_ID");
soapBodyElem3.addTextNode("123");
我在尝试强制关闭 XML SOAP 请求的标记时遇到问题,因为 Java 是 auto-generating self-closing 标记。这会导致包含问题并导致无效 sub-element 错误。下面显示了用于在 XML 中制作 SOAP body 的代码。 "request" 中有几个节点没有值,但服务器确实保存了数据。下面显示了我得到的输出和我需要的。今天是我第一天玩 Java 所以请用超级简单的术语或更好的方式解释,显示示例代码行。我读了一篇标题相似的文章 post 但似乎使用的是另一种语言。感谢您的帮助。
更新:在 w3schools 网站上声明:
"空 XML 元素 - 另一种语法可用于 XML 没有内容的元素:而不是写一个 book 元素(没有content) 像这样: <book></book>
可以这样写 <book />
这种元素语法叫做 self-closing."
因此,表达我的请求的另一种方式是,如何防止 Java 编译器编译 self-closing XML 元素以避免错误:"Invalid Subelement Worker_Reference-urn:com.workday/bsvc for element Get_Workers_Request (6639)"。我需要指定元素 / child 节点应该在树中的哪个位置关闭,因为这解决了我用其他语言(例如 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 (6639)
'------------------------------------------------------------------------
如何强制 XML 有结束标签?
你不知道。
您误解了错误。 与自闭标签无关 <e></e>
和<e/>
在[=65=中完全等价]. XML 处理者将以相同方式处理每种形式。一种形式不会出错,而另一种则不会。如果一个是对的,那么他们都是对的。另见
而是着眼于您正在组装的元素的实际组成。您的错误消息为您指明了正确的方向:
Invalid Subelement xxxxxx for element Get_Workers_Request (6639)
您在 Get_Workers_Request
中添加了一个 xxxxxx
,而您不应该这样做。 (顺便说一句,你到底为什么要屏蔽这个名字?)除了有用的验证消息,检查定义预期结构的架构 Get_Workers_Request
以获得进一步的指导。
关于更新#2
在您的更新 #2 代码中,这两个构造的请求甚至不等同,它们根本不支持您的说法,即您的问题源于 <e></e>
和 [=12] 之间的差异=]:
- 在有效的那个中,
wd:Request_References
包含wd:Worker_Reference
. - 在失败的
wd:Request_References
之前wd:Worker_Reference
.
即使您从这个答案中没有学到任何其他东西,如果您根据元素包含[=进行思考、编码和调试,您也会领先53=] 而不是 结束标签 .
你说 "it" returns 错误 Invalid Subelement ID-urn:com.workday/bsvc for element Get_Workers_Request (6639)
。但是 "it" 是什么?在我看来,它像是某种过程,正在根据某种模式验证您生成的 XML。在不知道这个验证器是什么或模式是什么的情况下,很难说得更具体,但我认为你几乎肯定是在咆哮错误的树,因为它想象它是由使用自闭标签引起的。
我想当我在上面尝试的最后一个回复中提到它时,我错过了一个要参考的数字。对于任何苦苦挣扎的人……这就是解决问题的方法。通过引用 soapBodyElem1
和 2,它将结束标记移到了我需要的地方。他们不再在同一行上自行关闭标签,而是将需要的元素封装在它们下面。
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 = soapBodyElem1.addChildElement("Worker_Reference", "wd");
SOAPElement soapBodyElem3 = soapBodyElem2.addChildElement("ID", "wd");
soapBodyElem3.setAttribute("wd:type", "Employee_ID");
soapBodyElem3.addTextNode("123");