मैं एक डोम दस्तावेज़ (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 "यूनिक्स-स्टाइल लाइन एंडिंग्स" प्राप्त करने के कार्य तक ही सीमित है। मेरे मामले में आदर्श समाधान एक घटक होगा जो डीओएम मॉडल उदाहरण को ठीक करता है, किसी भी नोड को छूना नहीं (अब तक सब कुछ क्या करता है)।

  • लाइन.सेपरेटर सिस्टम प्रॉपर्टी को बदलना कोई विकल्प नहीं है (टिप्पणी देखें)।

6
Gustave 3 मार्च 2017, 16:43
सिस्टम गुण लाइन.सेपरेटर को \n . पर सेट करें
 – 
Maurice Perry
3 मार्च 2017, 16:48
1
यह संभव हो सकता है, लेकिन यह एक विकल्प नहीं है क्योंकि यह अन्य कोड को तोड़ सकता है जो उस संपत्ति के सही मूल्य पर निर्भर करता है।
 – 
Gustave
3 मार्च 2017, 16:54
का संभावित डुप्लिकेट जावा के साथ विंडोज़ पर एक्सएमएल जेनरेट करते समय इस्तेमाल की जाने वाली स्टाइल लाइन एंडिंग्स
 – 
boskoop
3 मार्च 2017, 17:28

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)) अपनी पसंदीदा लाइन एंडिंग को परिभाषित या नियंत्रित करने के लिए।

3
Martin Honnen 3 मार्च 2017, 17:02
यह शायद सबसे अच्छा उपाय है। गुस्ताव को अपने परिवर्तन गंतव्य को DOMResult इस दृष्टिकोण का उपयोग करने के लिए।
 – 
VGR
3 मार्च 2017, 17:29
@VGR, मुझे समझ नहीं आता कि आपको DOMResult की आवश्यकता क्यों है, LSSerializer की एक विधि है docs.oracle.com/javase/7 /docs/api/org/w3c/dom/ls/… एक LSOutput को लिखने के लिए और जो आउटपुटस्ट्रीम या राइटर सेट करने की अनुमति देता है।
 – 
Martin Honnen
3 मार्च 2017, 17:52
मुद्दा वह नहीं है जहाँ LSSerializer लिखता है, यह LSSerializer का इनपुट है। गुस्ताव एक्सएमएल को बदलना चाहता है, और यह रूपांतरित एक्सएमएल है जिसमें अवांछित न्यूलाइन हैं।
 – 
VGR
3 मार्च 2017, 17:58
TransformerFactory.newInstance().newTransformer() के उपयोग से आप अपनी खुद की कोई भी एक्सएसएलटी स्टाइलशीट लागू नहीं करते हैं जो इनपुट एक्सएमएल को बदल देती है, आप केवल इनपुट एक्सएमएल को क्रमबद्ध करते हैं। TransformerFactory.newInstance().newTransformer(someXslt) करते समय यह अलग है लेकिन पोस्टिंग में यह नहीं दिखाया गया है।
 – 
Martin Honnen
3 मार्च 2017, 18:06
उफ़, तुम सही हो। मुझे याद आया कि वह एक पहचान ट्रांसफार्मर का उपयोग कर रहा था।
 – 
VGR
3 मार्च 2017, 18:07

मार्टिन होन्नेंस के उत्तर पर आधारित कार्य समाधान। (लेकिन यह बिल्कुल उस प्रश्न का उत्तर नहीं है, जो स्पष्ट रूप से ट्रांसफॉर्मर को संदर्भित करता है। तो शायद सही उत्तर "नहीं" है, लेकिन मैं इस समय इसे खुला छोड़ दूंगा।):

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"?>

और बाद में एक नई लाइन सम्मिलित करता है।

0
Gustave 3 मार्च 2017, 18:23