2015-05-29 82 views
0

我想在「ServiceAddRQ」以及「服務」標籤中創建下面的XML,其中具有xmlns:xsi =「http://www.w3.org/2001/XMLSchema-instance」。那麼可以創建這樣的XML嗎?是否有可能在父標籤和子標籤中編寫XMLSchema實例?

所需的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生成的XML:在Java中生成的代碼我得到 「服務」 標籤的空白的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); 
+0

對於「如何更改我的代碼以生成X而不是Y」的問題,您確實需要向我們顯示您想要更改的當前代碼......但請注意,您實際上並不需要'xmlns: xsi'聲明,因爲「Service」元素會自動繼承其父項的名稱空間聲明。 –

+0

嗨@IanRoberts,感謝您的寶貴迴應。你現在可以檢查我的java代碼片段。即使子標籤繼承父標籤命名空間,爲什麼我在Service標籤中獲得空白'xmlns'? –

+0

您可以確認您使用的是哪種XML對象模型,因爲它絕對不是DOM(如在org.w3c.dom中)。它看起來像JDOM,對嗎? –

回答

1

序列化程序正確添加xmlns=""是因爲您已使用默認名稱空間聲明創建了頂層元素,但添加了不在名稱空間中的子元素。要獲得所需的輸出,您需要創建Service元素,並使用與ServiceAddRQ相同的http://www.test.com/schemas/2005/06/messages命名空間。試試吧更多這樣的:

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

// -------------- 
// Key change -- Create Service element in the right namespace 
Element eleService=new Element("Service",NSSERVICE); 
// -------------- 

eleService.setAttribute("type", "ServiceHotel", NSSCHEMA); 
eleService.setAttribute("availToken",contractInfo[1]); 
barceloDS_requests.addContent(eleService); 

這將創建正確的輸出:

<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 xsi:type="ServiceHotel" availToken="1jMqWGjqrx25Bp60gV2Qggb3"/> 
</ServiceAddRQ> 

Service元素並不需要自己xmlns:xsi聲明,因爲這是繼承自父,但如果你明確想要添加一個冗餘的然後它可能使用eleService.addNamespaceDeclaration(NSSCHEMA)是可能的,但沒有保證,因爲串行器總是可以自由地省略冗餘名稱空間聲明,當他們不改變結果的語義。

+0

嗨@Ian謝謝回覆...將考慮您在未來的刪除帖子中提到的點... –

相關問題