在 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");