تقوم Java بإلحاق مستندات XML بالمستندات الموجودة

StackOverflow https://stackoverflow.com/questions/883987

  •  22-08-2019
  •  | 
  •  

سؤال

لدي مستندين بتنسيق XML قمت بإنشائهما وأريد دمج هذين المستندين داخل مظروف جديد.لذلك أنا أملك

<alert-set>
  <warning>National Weather Service...</warning>
  <start-date>5/19/2009</start-date>
  <end-date>5/19/2009</end-date>
</alert-set>

و

 <weather-set>
   <chance-of-rain type="percent">31</chance-of-rain>
   <conditions>Partly Cloudy</conditions>
   <temperature type="Fahrenheit">78</temperature>
 </weather-set>

ما أود القيام به هو الجمع بين الاثنين داخل عقدة الجذر:< DataSet> المستندات المدمجة < /DataSet>

لقد حاولت إنشاء مستند مؤقت واستبدال العناصر الفرعية بالعقد الجذرية للمستندات:

<DataSet>
  <blank/>
  <blank/>
</DataSet>

وكنت أتمنى استبدال الفراغين بالعناصر الجذرية للمستندين ولكني حصلت على "WRONG_DOCUMENT_ERR:يتم استخدام العقدة في مستند مختلف عن المستند الذي أنشأها." لقد حاولت اعتماد العقد الجذرية واستيرادها ولكني حصلت على نفس الخطأ.

ألا توجد طريقة سهلة لدمج المستندات دون الحاجة إلى القراءة وإنشاء عناصر جديدة لكل عقدة؟

يحرر:عينة من قصاصات التعليمات البرمجية فقط تحاول نقل واحدة إلى المستند "الفارغ" في الوقت الحالي ...لا يمكن لوظيفتي importNode وoptainNode استيراد/اعتماد عقد المستند، لكن لا يمكنهما استيراد عقدة العنصر وشجرتها الفرعية...أو إذا كان الأمر كذلك، فلا يبدو أنه يعمل على إلحاق/استبدال ما زال.

    Document xmlDoc;     //created elsewhere
    Document weather = getWeather(latitude, longitude);
    Element weatherRoot = weather.getDocumentElement();

    Node root = xmlDoc.getDocumentElement();
    Node adopt = weather.adoptNode(weatherRoot);
    Node imported = weather.importNode(weatherRoot, true);
    Node child = root.getFirstChild();

    root.replaceChild(adopt, child);      //initially tried replacing the <blank/> elements
    root.replaceChild(imported, child);

    root.appendChild(adopt);
    root.appendChild(imported);
    root.appendChild(adopt.cloneNode(true));

كل هذه رمي DOMException:WRONG_DOCUMENT_ERR:يتم استخدام العقدة في مستند مختلف عن تلك التي قامت بإنشائها.

أعتقد أنه سيتعين علي معرفة كيفية استخدام Stax أو مجرد إعادة قراءة المستندات وإنشاء عناصر جديدة...يبدو أن هذا يتطلب الكثير من العمل فقط لدمج المستندات.

هل كانت مفيدة؟

المحلول

وانها صعبة بعض الشيء، ولكن يعمل المثال التالي:

public static void main(String[] args) {

    DocumentImpl doc1 = new DocumentImpl();
    Element root1 = doc1.createElement("root1");
    Element node1 = doc1.createElement("node1");
    doc1.appendChild(root1);
    root1.appendChild(node1);

    DocumentImpl doc2 = new DocumentImpl();
    Element root2 = doc2.createElement("root2");
    Element node2 = doc2.createElement("node2");
    doc2.appendChild(root2);
    root2.appendChild(node2);

    DocumentImpl doc3 = new DocumentImpl();
    Element root3 = doc3.createElement("root3");
    doc3.appendChild(root3);

    // root3.appendChild(root1); // Doesn't work -> DOMException
    root3.appendChild(doc3.importNode(root1, true));

    // root3.appendChild(root2); // Doesn't work -> DOMException
    root3.appendChild(doc3.importNode(root2, true));   
}

نصائح أخرى

أعلم أنك قد قمت بحل المشكلة بالفعل، ولكنني مازلت أرغب في حل هذه المشكلة باستخدام XOM المكتبة التي أقوم باختبارها حاليًا (تتعلق بـ هذا السؤال)، وأثناء القيام بذلك، قدم نهجًا مختلفًا عن إجابة Andreas_D.

(لتبسيط هذا المثال، أضع الخاص بك <alert-set> و <weather-set> في ملفات منفصلة، ​​والتي قرأت فيها nu.xom.Document الحالات.)

import nu.xom.*;

[...]

Builder builder = new Builder();
Document alertDoc = builder.build(new File("src/xomtest", "alertset.xml"));
Document weatherDoc = builder.build(new File("src/xomtest", "weatherset.xml"));
Document mainDoc = builder.build("<DataSet><blank/><blank/></DataSet>", "");

Element root = mainDoc.getRootElement();
root.replaceChild(
    root.getFirstChildElement("blank"), alertDoc.getRootElement().copy());
root.replaceChild(
    root.getFirstChildElement("blank"), weatherDoc.getRootElement().copy());

المفتاح هو عمل نسخة من العناصر التي سيتم إدراجها فيها mainDoc;وإلا فسوف تحصل على شكوى مفادها أن "الطفل لديه أحد الوالدين بالفعل".

إخراج mainDoc يعطي الآن:

<?xml version="1.0" encoding="UTF-8"?>
<DataSet>
    <alert-set>
        <warning>National Weather Service...</warning>
        <start-date>5/19/2009</start-date>
        <end-date>5/19/2009</end-date>
    </alert-set>
    <weather-set>
        <chance-of-rain type="percent">31</chance-of-rain>
        <conditions>Partly Cloudy</conditions>
        <temperature type="Fahrenheit">78</temperature>
    </weather-set>
</DataSet>

ومن دواعي سروري أن هذا كان أمرًا سهلاً للغاية بالنسبة لـ XOM.لم يستغرق الأمر سوى بضع دقائق لكتابة هذا، على الرغم من أنني بالتأكيد لا من ذوي الخبرة مع المكتبة حتى الآن.(كان من الممكن أن يكون الأمر أسهل بدون <blank/> العناصر، أي البدء ببساطة <DataSet></DataSet>.)

لذا، ما لم تكن لديك أسباب مقنعة لاستخدام أدوات JDK القياسية فقط، فإنني أوصي بشدة بتجربة XOM لأنه يمكن أن يجعل التعامل مع XML في Java أكثر متعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top