জাভা: ট্রান্সফরমার দ্বারা উত্পাদিত এক্সএমএল কীভাবে ইন্ডেন্ট করা যায়


112

আমি একটি ডিওএম ডকুমেন্ট নিতে এবং ফলাফলের এক্সএমএল মুদ্রণ করতে জাভা নির্মিত এক্সএমএল ট্রান্সফর্মার ব্যবহার করছি। সমস্যাটি হ'ল প্যারামিটারটি স্পষ্টভাবে "ইনডেন্ট" সেট করা সত্ত্বেও এটি টেক্সটটি ইনডেন্টিং করছে না।

কোডের উদাহরণ

public class TestXML {

 public static void main(String args[]) throws Exception {
  ByteArrayOutputStream s;

  Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  Transformer t = TransformerFactory.newInstance().newTransformer();

  Element a,b;

  a = d.createElement("a");
  b = d.createElement("b");

  a.appendChild(b);

  d.appendChild(a);

  t.setParameter(OutputKeys.INDENT, "yes");

  s = new ByteArrayOutputStream();

  t.transform(new DOMSource(d),new StreamResult(s));

  System.out.println(new String(s.toByteArray()));

 }
}

ফলাফল

<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>

কাঙ্ক্ষিত ফলাফল

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
 <b/>
</a>

থটস?

উত্তর:


215

ট্রান্সফর্মারের জন্য আপনাকে 'INDENT' সক্ষম করতে হবে এবং ইনডেন্টের পরিমাণ নির্ধারণ করতে হবে:

t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

হালনাগাদ:


রেফারেন্স: সিরিয়ালাইজেশনের আগে ডিওএম থেকে কেবল সাদা অংশের পাঠ্য নোডগুলি কীভাবে ফেলা যায়?

(সকল সদস্যকে বিশেষত @ মার্ক-নোভোকভেস্কি, @ জেমস-মুর্তি এবং @ এসএডকে অনেক ধন্যবাদ) :


70
আমার কাছে নির্বোধ বলে মনে হয় যে ডিফল্ট ইনডেন্টেশন 0 INDENT=yesহয় তবে t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
এটির

1
সতর্ক থাকুন। এই ইন্ডেন্টেশন সম্পত্তি জাভা 5 তে কাজ করে না it এটি জাভাতে 7.. জাভা
in-তে

4
যদি এমন অভ্যন্তরীণ নোড থাকে যা একাধিক লাইন থাকে তবে আপনি কি অভ্যন্তরীণ অংশটিও যুক্ত করতে পারবেন? কেবল এটি ব্যবহার করা অভ্যন্তরীণ নোডগুলিকে প্রবেশ করতে পারে না।
eipark

1
সঙ্গে @eipark stackoverflow.com/a/979606/837530 , আমি অনুসরণকারী শূণ্যস্থান, এবং এখন ইনডেন্ট একটি যাদুমন্ত্র মত মুছে
সাদ

1
@ ললাপ যদি আপনার সরবরাহকারটি জালান হয় (এটি সম্ভবত এটি কাজ করে তবে) তবে এটি উপলভ্যorg.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT
অরেঞ্জডগ

21

প্রস্তাবিত সমাধানগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি। সুতরাং আমি বিকল্প সমাধানের সন্ধান করতে থাকি, যা ইতিপূর্বে উল্লিখিত দুটি এবং তৃতীয় পদক্ষেপের মিশ্রণ হিসাবে শেষ হয়েছিল।

  1. ট্রান্সফরমারফ্যাক্টরিতে ইনডেন্ট নম্বরটি সেট করুন
  2. ট্রান্সফর্মারে ইনডেন্ট সক্ষম করুন
  3. কোনও লেখক (বা বাফারাইডার) এর সাথে ওটুপুটস্র্যাম্প মোড়ানো
//(1)
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));

//(2)
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");

//(3)
t.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "utf-8"));

এক্সএমএল হ্যান্ডলিং কোডটির "বগি" আচরণটি করতে আপনাকে অবশ্যই (3) করতে হবে।

সূত্র: johnnymac75 @ http://bugs.sun.com/bugdatedia/view_bug.do?bug_id=6296446

(যদি আমি আমার উত্সটি ভুলভাবে উদ্ধৃত করে থাকে তবে দয়া করে আমাকে জানান)


3
শেষ লাইনে "আউট" কী বোঝায়?
মুজিমু

আপনার কি কনস্ট্রাক্টর ব্যবহার করে একটি নতুন পূর্ণসংখ্যা তৈরি করা দরকার?
বেনজিনার

আমি অনুমান করছি কারণ আপনার সরবরাহকারী জালান নয়। আপনার যা TransformerFactoryআসলে তা তাই যাচাই করতে পারেন যাতে অন্যরা জানতে পারে।
অরেঞ্জডগ

পদক্ষেপ 3, একটি Writerআউটপুট হিসাবে ব্যবহার করা প্রয়োজনীয়।
এরিকসন

14

নীচের কোডটি জাভা with এর সাথে আমার জন্য কাজ করছে it আমি কাজটি পেতে ট্রান্সফর্মারে (ট্রান্সফরমার কারখানা নয়) ইনডেন্ট (হ্যাঁ) এবং ইনডেন্ট-পরিমাণ (2) সেট করি।

TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(source, result);

অ্যাট্রিবিউট সেট করার জন্য @ মাব্যাকের সমাধানটি আমার পক্ষে কার্যকর হয়নি, তবে @ লাপোর মন্তব্য সহায়ক হিসাবে প্রমাণিত হয়েছে।


8

আমদানি করুন com.sun.org.apache.xml.intern.serializer.OutputPropertiesF কারখানা

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");

এটি একটি অভ্যন্তরীণ শ্রেণি, সুতরাং আপনার কোডটি অন্যান্য (বা আরও নতুন) জেভিএমের কাছে পোর্টেবল হবে না।
অরেঞ্জডগ

5

আপনি যদি ইন্ডেন্টেশন চান, আপনাকে এটিতে উল্লেখ করতে হবে TransformerFactory

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();

4

আমি ট্রান্সফরমারের সাথে জগাখিচির পরিবর্তে জেরেস (অ্যাপাচি) লাইব্রেরি ব্যবহার করেছি। একবার আপনি লাইব্রেরি যুক্ত করলে নীচের কোডটি যুক্ত করুন।

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer outxml = new FileWriter(new File("out.xml"));
XMLSerializer serializer = new XMLSerializer(outxml, format);
serializer.serialize(document);

হ্যাঁ. আমি ট্রান্সফর্মার দিয়ে অন্যান্য সমস্ত পদ্ধতির চেষ্টা করেছিলাম কিন্তু সমস্ত ভাঙা। পুরো ডাব্লু 3 সি লাইব্রেরি একটি গোলযোগ। জেরেসেস কাজ করেছিল।
Tuntable

3

আমার জন্য DOCTYPE_PUBLICকাজ যুক্ত:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");

transformer.setOutputProperty (OutputKeys.DOCTYPE_PUBLIC, "হ্যাঁ"); মূল কী
সাইলেন্টসডো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.