2014-07-21 74 views
0

所以我有一些生成XML的遺留代碼。問題在於它通過打開和關閉標籤來操作,並將所有內容寫入文件。是否可以添加屬性作爲元素?

startTag("race") 
endTag() 

將產生:

這是一切優秀和良好。除了關於種族的某些相關信息只能在endTag()時被推斷出來。即endTime。我想要生成的XML將是:

<race startTime="123" endTime="456> 
</race> 

但我知道這是不可能的,沒有重大的重寫。我不感到激動。如果在XSLT轉換中有相當於使用xsl:attribute的東西,那真是太棒了。在哪裏我可以得到這樣的一些XML:

<race startTime="123"> 
    <attribute name="endTime"> 
     456 
    </attribute> 
</race> 

這被認爲是正確的格式。

這可能嗎?請注意,我無法繞過屬性要求,因爲它必須符合我無法控制的架構。所以我需要一種方法來使其成爲「適當」屬性。

+0

不,沒有那樣的東西。它位於何處?即使有這樣的事情,你仍然需要修改遺留代碼來使用它。代碼目前對endtime有什麼作用? –

+0

什麼都沒有?我只需要修改調用打開和關閉標籤的代碼部分。不是實際的功能。它目前離開它們,這妨礙了正確的操作。 –

+0

它目前離開_什麼?現在它產生了什麼,以及你需要它產生什麼? –

回答

1

如果有問題的元素是空的,那麼它應該是'太難了。如果你的代碼是Java中,你可以很容易地將其轉換爲使用XMLStreamWriter允許調用序列像

startElement() 
attribute() 
attribute() 
endElement() 

,並通過延遲輸出處理這個「>」在開始標籤的結束,直到它知道所有的屬性已經到了。但是如果你想寫出「無序」內容,所以元素內容在屬性之前輸出,那麼你需要一種非常不同的方法。例如,您可以輸出「屬性」作爲處理指令,然後使用XSLT執行後處理,將處理指令轉換爲包含元素上的屬性。

+0

我使用的XML編寫器都是自定義代碼,無法避免。你已經看到了這個問題的核心,我需要「無序」地構建它。我認爲你現在的處理指導建議是我最好的選擇。謝謝。 –

0

通常的解決方案確實是重寫你的代碼。你們沒有給我們足夠的信息提供任何信息,以告訴你這將是多麼容易或困難。通常的解決方案是將屬性傳遞給寫出起始標籤的方法,或者延遲實際寫出起始標籤語法,直到您知道不會再添加任何屬性(這就是典型的XSLT串行器工程,所以它可以處理<xsl:attribute>指令)。

或者您可以在內存中構建整個文檔,以便您可以輕鬆地返回並重新編輯以前構建的樹部分。

或者你可以通過其他方式解決這個問題。哪一個最有意義取決於你沒有告訴我們關於你的代碼試圖做什麼,它使用什麼XML庫等的所有那些東西。

相關問題