2016-07-11 60 views
0

我想知道是否有任何方法可以格式化我生成的XML文檔,從而使屬性垂直對齊?下面是我寫的轉換方法的一個片段。將XML格式化爲垂直對齊

我創建的元素是這樣的:

Element element = document.createElement(elementName); 
    element.setAttribute("name", nameAttribute); 
    element.setAttribute("id", idAttribute); 
    element.setAttribute("val", valAttribute); 

然後將它們添加到文檔準備轉型。

TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer; 

    try { 
     transformer = factory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty(OutputKeys.VERSION, "1.0"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 

     DOMSource source = new DOMSource(document); 
     File file = new File(fileName); 

     StreamResult result = new StreamResult(file); 
     transformer.transform(source, result); 
    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } 

我能夠得到壓痕的工作,但我也想知道是否有任何的方式來填充屬性,讓他們排隊彼此的下方。

目前,它看起來像:

<ref name="message" type="message.sender"> 
    <p id="1" name="BeginString" val="${BeginString}"/> 
    <p id="36" name="Message" val="${Message}"/> 
    <p id="42" name="Sender" val="${Sender}"/> 
    <p id="73" name="SendingTime" val="${SendingTime}"/> 
    <p id="1134" name="Target" val="${Target}"/> 
</ref> 

但是我想有它的格式是這樣的。

<ref name="message" type="message.sender"> 
    <p id="1"  name="BeginString" val="${BeginString}"/> 
    <p id="36" name="Message"  val="${Message}"/> 
    <p id="42" name="Sender"  val="${Sender}"/> 
    <p id="73" name="SendingTime" val="${SendingTime}"/> 
    <p id="1134" name="Target"  val="${Target}"/> 
</ref> 

我這樣做的唯一原因是,在較長的文件,它使內容更容易閱讀和程序將給予較少的技術人員的人也是如此。

感謝

+0

有一種方法。自己寫XML文本*(不推薦)*。 – Andreas

+0

@Andreas我的前任已經做好了這個工作,我不幸的是,現在需要承擔後果。我有看起來像這樣的線 'writer.write(「 \ n」);' – Andrew

回答

0

我從來沒有在XML庫中看到這樣的功能。

如果您的文檔只有您顯示的結構,您可以根據自己的喜好創建自定義的ContentHandler來輕鬆序列化。只需擴展DefaultHandler並執行startElementendElement即可打印refp元素。使用XML來轉義屬性值。然後使用由XMLReaderFactory獲取的XMLReader解析文檔,並使用自定義ContentHandler進行配置,以觸發事件並打印文檔。它也會比TrAX快得多。

我通常不會推薦這樣做,但如果它確實有助於使非技術人員能夠完成任務並讓開發人員獨自一人,那麼就去做吧。

+0

感謝您的建議。我會簡要介紹一下,如果看起來像超過10分鐘的工作,用戶將不得不忍受這種格式。 – Andrew

0

TL; DR - 沒有什麼的,這是否任何標準或庫。

XML旨在供程序使用,而不是人類。因此,非重要空間恰好是非重要的,並且序列化程序不需要或不期望對它們做任何特殊的事情,或提供任何選項來漂亮地打印它們。尤其是關於協調不同的標籤之間的屬性間距。

從理論上講,您可以提供自己的序列化程序,但這需要很多工作,您必須決定哪些構成相鄰標記需要使其屬性對齊,當屬性順序不同時會發生什麼等等等,等等。你總是會遇到你不太對付「正確」的情況。

總之,沒有什麼標準可以實現你想要的,並且編寫代碼來做到這一點,恕我直言就是浪費時間。

+0

I知道XML是爲程序設計的,但是如果格式良好,人類也可以很容易地進行消化。 不幸的是,我已經設置了一個先例,我知道必須遵循,並且利用現有的庫比花費幾個小時編寫writer.write()來附加文件要好得多。 同樣作爲我的開發人員,我認爲我們的角色是幫助最終用戶使用我們的程序並使XML更具可讀性是實現這一目標的一個小方法。至少在這種情況下。 – Andrew