আমি কীভাবে org.w3c.dom আউটপুট করব? জাভাতে স্ট্রিং ফর্ম্যাটটির উপাদান?


90

আমি org.w3c.dom.Elementআমার পদ্ধতিতে একটি জিনিস পাস হয়েছে। আমাকে তার শিশু নোডগুলি সহ পুরো এক্সএমএল স্ট্রিংটি দেখতে হবে (পুরো বস্তুর গ্রাফ)। আমি একটি পদ্ধতি যা রূপান্তর করতে পারেন খোঁজ করছি Elementএকটি XML বিন্যাসে স্ট্রিং মধ্যে যে আমি করতে পারেন System.out.printlnহবে। কেবলমাত্র println()'এলিমেন্টে' অবজেক্টটি কাজ করবে না কারণ toString()xML ফর্ম্যাটটি আউটপুট দেয় না এবং চাইল্ড নোডের মধ্য দিয়ে যাবে না। এটি করার জন্য আমার নিজস্ব পদ্ধতি না লিখে কোনও সহজ উপায় আছে? ধন্যবাদ

উত্তর:


156

ধরে নিচ্ছি যে আপনি স্ট্যান্ডার্ড এপিআইয়ের সাথে লেগে থাকতে চান ...

আপনি একটি DOMImplementationLS ব্যবহার করতে পারেন :

Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
    .getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);

যদি <? XML version = "1.0" এনকোডিং = "UTF-16"?> ঘোষণা আপনাকে বিরক্ত করে তোলে, আপনি পরিবর্তে ট্রান্সফর্মার ব্যবহার করতে পারেন :

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
      new StreamResult(buffer));
String str = buffer.toString();

7
আপনি যদি [এইচটিএমএল: নাল] পেয়ে থাকেন এবং এইচটিএমএলটি আশা করেন তবে এটিই সমাধান। এই মন্তব্যটি যুক্ত করা হয়েছে যাতে গুগল উত্তরটি আশাবাদী করে তুলতে পারে।
ডোনাল টোবিন

4
আপনি এখনও এলএসএসিয়ালাইজার এবং "ইউটিএফ -8" আউটপুট ব্যবহার করতে পারেন। পরিবর্তে স্ট্রিং রাইটারের সাথে এলএসআউটপুট ব্যবহার করুন এবং এনকোডিং প্রকারটি "
ইউটিএফ-


4
<?xml version="1.0" encoding="UTF-16"?>ঘোষণা বিরক্ত করে ... আমরাও serializer .getDomConfig().setParameter("xml-declaration", false); প্রথম সমাধানটিতে এই লাইনটি যুক্ত করতে পারি ....
তারসেম সিং

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

16

সরল 4 লাইন কোড পাওয়ার জন্য String ছাড়া XML-ঘোষণা ( <?xml version="1.0" encoding="UTF-16"?>) থেকেorg.w3c.dom.Element

DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
LSSerializer serializer = lsImpl.createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", false); //by default its true, so set it to false to get String without xml-declaration
String str = serializer.writeToString(node);

2

স্ট্যান্ডার্ড জ্যাকএক্সপি এপিআই-তে সমর্থিত নয়, আমি জেডম লাইব্রেরিটি এই উদ্দেশ্যে ব্যবহার করেছি। এটিতে একটি মুদ্রক ফাংশন, বিন্যাসের বিকল্পগুলি রয়েছে http:// http://www.jdom.org/


এটি +1 স্ট্যান্ডার্ড org.w3c.dom API এর উদ্দেশ্য না হওয়ার জন্য। আমি যদি টেক্সট হিসাবে এক্সএমএল ব্লকগুলিতে আগ্রহী, আমি সাধারণত কেবল এটি একটি রেজেক্স ম্যাচের সাথে পাঠ্য হিসাবে পার্স করার চেষ্টা করি (যদি অনুসন্ধানের মানদণ্ডটি সহজেই রেজেক্স হিসাবে উপস্থাপন করা হয়)।
কর্নেল ম্যাসন

2

যদি আপনার এক্সএমএল এর স্কিমা থাকে বা অন্যথায় এর জন্য জ্যাকএক্সবি বাইন্ডিং তৈরি করতে পারে তবে আপনি জ্যাকএক্সবি মার্শলারকে সিস্টেম.আউটে লিখতে ব্যবহার করতে পারেন:

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRootElement
public class BoundClass {

    @XmlAttribute
    private String test;

    @XmlElement
    private int x;

    public BoundClass() {}

    public BoundClass(String test) {
        this.test = test;
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jxbc = JAXBContext.newInstance(BoundClass.class);
        Marshaller marshaller = jxbc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(new JAXBElement(new QName("root"),BoundClass.class,new Main("test")),System.out);
    }
}

2

এক লাইনার সহ জ্যাকবি-এক্সএমএল চেষ্টা করুন :

String xml = new XMLDocument(element).toString();

জেসিবি-এক্সএমএল এর নতুন সংস্করণগুলি এলিমেন্টকে প্যারাম হিসাবে সমর্থন করে না, কেবল নোড / ফাইল / স্ট্রিং।
এরমিন্টার

1

এটিই জাসাবিতে করা হয়:

private String asString(Node node) {
    StringWriter writer = new StringWriter();
    try {
        Transformer trans = TransformerFactory.newInstance().newTransformer();
        // @checkstyle MultipleStringLiterals (1 line)
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty(OutputKeys.VERSION, "1.0");
        if (!(node instanceof Document)) {
            trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        }
        trans.transform(new DOMSource(node), new StreamResult(writer));
    } catch (final TransformerConfigurationException ex) {
        throw new IllegalStateException(ex);
    } catch (final TransformerException ex) {
        throw new IllegalArgumentException(ex);
    }
    return writer.toString();
}

এবং এটি আমার জন্য কাজ করে!


0

সঙ্গে VTD-এক্সএমএল , আপনি কার্সার মধ্যে প্রেরণ এবং সেগমেন্ট পুনরুদ্ধার করতে (যেমন তার দ্বারা প্রকাশ অফসেট এবং দৈর্ঘ্য) একটা একক getElementFragment কল করতে পারেন ... নিচে একটি উদাহরণ

import com.ximpleware.*;
public class concatTest{
    public static void main(String s1[]) throws Exception {
        VTDGen vg= new VTDGen();
        String s = "<users><user><firstName>some </firstName><lastName> one</lastName></user></users>";
        vg.setDoc(s.getBytes());
        vg.parse(false);
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/users/user/firstName");
        int i=ap.evalXPath();
        if (i!=1){
            long l= vn.getElementFragment();
            System.out.println(" the segment is "+ vn.toString((int)l,(int)(l>>32)));
        }
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.