我想在"ServiceAddRQ"以及"Service"标签下创建 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 以下的XML . 那么可以创建这样的XML吗?
Required XML :
<ServiceAddRQ echoToken="DummyEchoToken" version="2013/12"
xmlns="http://www.test.com/schemas/2005/06/messages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/schemas/2005/06/messages ServiceAddRQ.xsd">
<Service xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ServiceHotel" availToken="1jMqWGjqrx25Bp60gV2Qggb3">
</Service>
</ServiceAddRQ>
Java Generated XML : 在java生成的代码中我得到"Service"标签的空白xmlns ...
<ServiceAddRQ xmlns="http://www.test.com/schemas/2005/06/messages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" echoToken="6BB6B47EEEF4290515103925"
version="2013/12"
xsi:schemaLocation="http://www.test.com/schemas/2005/06/messages HotelValuedAvailRQ.xsd">
<Service xmlns="" xsi:type="ServiceHotel" availToken="1/YncBXZJXY17Z/ygNiO7gcg">
</Service>
</ServiceAddRQ>
Java代码相同:
static private Namespace NSSERVICE = Namespace.getNamespace("http://www.test.com/schemas/2005/06/messages");
static private Namespace NSSCHEMA = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
String sXMLOut = "";
Element barceloDS_requests= new Element("ServiceAddRQ",NSSERVICE);
barceloDS_requests.setAttribute("echoToken",searchParams.getSessionID().substring(0, 12)+GenTools.getSystemDateWithTime3());
barceloDS_requests.setAttribute("version","2013/12");
barceloDS_requests.addNamespaceDeclaration(NSSCHEMA);
barceloDS_requests.setAttribute("schemaLocation", "http://www.test.com/schemas/2005/06/messages HotelValuedAvailRQ.xsd", NSSCHEMA);
Namespace xsi = Namespace.getNamespace(GenTools.returnEmptyForNull(sXMLNS_XSI), "http://www.w3.org/2001/XMLSchema-instance");
Element eleService=new Element("Service");
eleService.setAttribute("type", "ServiceHotel", xsi);
eleService.setAttribute("availToken",contractInfo[1]);
barceloDS_requests.addContent(eleService);
sXMLOut = new GetXMLOutputter().getXMLOutputter(barceloDS_requests,true);
1 回答
序列化程序添加
xmlns=""
是正确的,因为您创建了一个带有默认命名空间声明的顶级元素,但随后添加了一个不在命名空间中的子元素 . 要获得所需的输出,您需要使用与根ServiceAddRQ
相同的http://www.test.com/schemas/2005/06/messages
名称空间创建Service
元素 . 尝试更像这样:这将创建正确的输出:
Service
元素不需要自己的xmlns:xsi
声明,因为它是从父节点继承的,但是如果您特别想要添加冗余节点,则可能使用eleService.addNamespaceDeclaration(NSSCHEMA)
但是's no guarantee as the serializer is always free to omit redundant namespace declarations when they don't会更改结果的语义 .