मैं एक डोम दस्तावेज़ (org.w3c.dom.Document) का उपयोग कर एक स्ट्रीम में बदल रहा हूं
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, UTF_8.name());
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamResult output = new StreamResult(out);
Source input = new DOMSource(document);
transformer.transform(input, output);
दस्तावेज़ में लाइनफ़ीड ('\n') के साथ टेक्स्ट नोड हैं। आउटपुट में उन्हें CRLF ("\r\n") से बदल दिया जाता है, जो वांछित नहीं है। क्या इसे नियंत्रित करने का कोई तरीका है (बेशक बाद में उन्हें बदलने के अलावा)?
दस्तावेज़ डीटीडी (-> एक्सएमएल व्हाइटस्पेस हैंडलिंग) पर मेरा कोई नियंत्रण नहीं है।
(टिप्पणी: OutputKeys.INDENT सही उत्तर नहीं है।)
टिप्पणी: यह प्रश्न प्रश्न 19102804 (यूनिक्स-शैली की पंक्ति के अंत सुनिश्चित करें):
यह प्रश्न स्पष्ट रूप से javax.xml.transform.Transformer और लाइन एंडिंग्स के उपचार को प्रभावित करने की संभावनाओं को संदर्भित करता है। प्रश्न 19102804 किसी भी समाधान के लिए पूछता है, न कि केवल javax.xml.transform.Transformer का उपयोग करने वाले के लिए।
प्रश्न 19102804 "यूनिक्स-स्टाइल लाइन एंडिंग्स" प्राप्त करने के कार्य तक ही सीमित है। मेरे मामले में आदर्श समाधान एक घटक होगा जो डीओएम मॉडल उदाहरण को ठीक करता है, किसी भी नोड को छूना नहीं (अब तक सब कुछ क्या करता है)।
लाइन.सेपरेटर सिस्टम प्रॉपर्टी को बदलना कोई विकल्प नहीं है (टिप्पणी देखें)।
2 जवाब
यदि आप केवल एक डोम नोड को क्रमबद्ध करना चाहते हैं तो जावा दुनिया में आप LSSerializer
(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/LSSerializer.html ) डिफ़ॉल्ट Transformer
के बजाय और फिर आपके पास विधि setNewLine
(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/LSSerializer .html#setNewLine(java.lang.String)) अपनी पसंदीदा लाइन एंडिंग को परिभाषित या नियंत्रित करने के लिए।
DOMResult
की आवश्यकता क्यों है, LSSerializer
की एक विधि है docs.oracle.com/javase/7 /docs/api/org/w3c/dom/ls/… एक LSOutput
को लिखने के लिए और जो आउटपुटस्ट्रीम या राइटर सेट करने की अनुमति देता है।
TransformerFactory.newInstance().newTransformer()
के उपयोग से आप अपनी खुद की कोई भी एक्सएसएलटी स्टाइलशीट लागू नहीं करते हैं जो इनपुट एक्सएमएल को बदल देती है, आप केवल इनपुट एक्सएमएल को क्रमबद्ध करते हैं। TransformerFactory.newInstance().newTransformer(someXslt)
करते समय यह अलग है लेकिन पोस्टिंग में यह नहीं दिखाया गया है।
मार्टिन होन्नेंस के उत्तर पर आधारित कार्य समाधान। (लेकिन यह बिल्कुल उस प्रश्न का उत्तर नहीं है, जो स्पष्ट रूप से ट्रांसफॉर्मर को संदर्भित करता है। तो शायद सही उत्तर "नहीं" है, लेकिन मैं इस समय इसे खुला छोड़ दूंगा।):
final DOMImplementationLS dom =
(DOMImplementationLS) DOMImplementationRegistry.newInstance().getDOMImplementation("LS")
;
final LSSerializer serializer = dom.createLSSerializer();
serializer.setNewLine("\n");
final LSOutput destination = dom.createLSOutput();
destination.setEncoding(UTF_8.name());
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
destination.setByteStream(bos);
serializer.write(document, destination);
ट्रान्सफ़ॉर्मर और LSSerializer के बीच एक अंतर यह है कि ट्रान्सफ़ॉर्मर लिखता है
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
बाद में व्हाइटस्पेस डाले बिना, जबकि LSSerializer लिखता है
<?xml version="1.0" encoding="UTF-8"?>
और बाद में एक नई लाइन सम्मिलित करता है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।