在Java中指定一个XML结束标记(对于空元素,它自动<;Self Closes/>;)-或-Syntax以包含指定父分支下的子节点?

在Java中指定一个XML结束标记(对于空元素,它自动<;Self Closes/>;)-或-Syntax以包含指定父分支下的子节点?,java,xml,soap,tags,Java,Xml,Soap,Tags,我在尝试强制XML SOAP请求的关闭标记时遇到问题,因为Java自动生成自动关闭标记。这会导致包含问题,并导致无效的子元素错误。下面显示了用于在XML中生成SOAP主体的代码。“请求”中有几个节点没有值,但服务器确实为其保存数据。下面显示了我得到的输出和我需要的。今天是我玩Java的第一天,所以请用超级简单的术语解释,或者更好,展示一个示例代码行。我读了一篇标题类似的文章,但似乎是用另一种语言写的。谢谢你的帮助 更新:w3schools网站上声明: “空XML元素-对于没有内容的XML元素,可

我在尝试强制XML SOAP请求的关闭标记时遇到问题,因为Java自动生成自动关闭标记。这会导致包含问题,并导致无效的子元素错误。下面显示了用于在XML中生成SOAP主体的代码。“请求”中有几个节点没有值,但服务器确实为其保存数据。下面显示了我得到的输出和我需要的。今天是我玩Java的第一天,所以请用超级简单的术语解释,或者更好,展示一个示例代码行。我读了一篇标题类似的文章,但似乎是用另一种语言写的。谢谢你的帮助

更新:w3schools网站上声明: “空XML元素-对于没有内容的XML元素,可以使用另一种语法:不是像这样编写book元素(没有内容):
它可以像这样编写
这种元素语法称为自动关闭。”

因此,陈述我的请求的另一种方式是,如何防止Java编译器编译自动关闭的XML元素以避免错误:“无效的子元素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>
//---------------------------------------------------------------------------
//***************这是身体密码*****************---------------------
//---------------------------------------------------------------------------
SOAPBody SOAPBody=envelope.getBody();
SOAPElement soapBodyElem=soapBody.addChildElement(“获取工作人员请求”、“wd”、“urn:com.workday/bsvc”);
SOAPElement soapBodyElem1=soapBodyElem.addChildElement(“请求\引用”,“wd”);
SOAPElement soapBodyElem2=soapBodyElem.addChildElement(“Worker_Reference”,“wd”);
SOAPElement soapBodyElem3=soapBodyElem.addChildElement(“ID”、“wd”);
soapBodyElem3.setAttribute(“wd:type”、“Employee_ID”);
soapBodyElem3.addTextNode(“123”);
//---------------------------------------------------------------------------
//***************这就是我得到的------------------------
//---------------------------------------------------------------------------
123
//----------------------------------------------------------------------------
//***************这就是我需要的------------------------
//----------------------------------------------------------------------------
123
更新#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)
'------------------------------------------------------------------------
sEnv=sEnv&“
sEnv=sEnv&“
sEnv=sEnv&&sEmployee\u ID&
sEnv=sEnv&“
sEnv=sEnv&“
'--------------------------
'返回值-约翰·史密斯
'--------------------------
sEnv=sEnv&“
sEnv=sEnv&“
sEnv=sEnv&&sEmployee\u ID&
“sEnv=sEnv&”
“sEnv=sEnv&”
'------------------------------------------------------------------------
'返回错误-元素Get\u Workers\u请求的子元素ID urn:com.workday/bsvc无效(6$16639)
'------------------------------------------------------------------------

如何强制XML具有结束标记

你没有。 你误解了错误它与自动关闭标记无关。
在XML中完全等效。XML处理器将以相同的方式处理每个表单。一个表单不会出错,但另一个表单不会。如果一个是对的,他们两个都是对的。另见

相反,请查看正在组装的元素的实际组成。错误消息为您指明了正确的方向:

Invalid Subelement xxxxxx for element Get_Workers_Request (6$16639)
您正在将一个
xxxxxx
添加到
Get\u Workers\u请求
中您不应该在的位置。(顺便说一句,你到底为什么要阻止这个名字?)除了有用的验证消息之外,还要检查定义
Get\u Workers\u Request
预期结构的模式,以获得进一步的指导

关于更新#2 在您的update#2代码中,两个构造的请求甚至不接近相等,它们根本不支持您的说法,即您的问题源于
之间的差异:

  • 在一个有效的应用程序中,
    wd:Request\u引用
    包含
    wd:Worker\u参考
  • 在失败的请求中,wd:Request\u引用位于
    wd:Worker\u参考

即使你从这个答案中学不到任何其他东西,如果你在元素包含方面思考、编码和调试,而不是关闭标记,你说“it”返回了一个错误
无效的子元素ID urn:com.workday/bsvc for element Get_Workers_Request(6$16639)
。但什么是“它”?在我看来,这就像是一种根据某种模式验证生成的XML的过程。在不知道这个验证器是什么或模式是什么的情况下,很难说得更具体,但我认为你几乎肯定是找错了方向,因为你认为这是由于使用了自动关闭标签造成的。

我想我在上面尝试的最后一个回复中提到它时,错过了一个要参考的数字。对于任何挣扎的人。。。这是修复它的方法。通过引用soapBodyElem1和2,它将结束标记移动到我需要的地方。它们不再自动关闭同一个lin上的标签
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");