تحويل عقدة DOM أو مستند إلى XML في جافا سكريبت

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

  •  06-07-2019
  •  | 
  •  

سؤال

ويقول كنت في جافا سكريبت يتم تسليم عنصر DOM واحد أو وثيقة (على سبيل المثال window.document)، كيف يتحول ذلك إلى XML صالحة؟

وبشكل أكثر تحديدا على سبيل المثال بلدي، ولدي صفحة على شبكة الإنترنت التي تعرض هو وSVG، هذا SVG لديه الكثير من جافا سكريبت للسماح التفاعل. انها عرض الرسم البياني الذي يسمح لك تكبير الرسم البياني وحتى جعل بعض التحولات. الآن المستخدمين من هذا العوز لديهم "صورة حفظ" زر. الطريق أتصور قيام بذلك هو اتخاذ عقدة ثيقة للعنصر SVG، وتحويلها إلى XML، ثم ترسل إلى أن الخادم الذي ثم يعود صفحة مع وثيقة SVG، أو صورة PNG.

وهذا هو كل يعمل على فايرفوكس (والذي هو حاليا من متطلبات المستخدمين، على الرغم من أنه يعمل بشكل جيد في سفاري وكروم كذلك). في فايرفوكس في صفحة الويب، ولقد تضمنت وثيقة SVG كعنصر كائن. في جافا سكريبت يمكنني الوصول إلى تلك الكائنات contentDocument، الذي يشير إلى جذر خارج الصفحة XML. أنه يحتوي على نسخة XML، علامة وثيقة، والعلامة SVG الجذر مع جميع الصفات.

وربما شخص ما قد حل بالفعل هذا، حتى أتمكن من نسخ التعليمات البرمجية الخاصة بهم. ربما هناك من يعرف أن ننظر فيها في الحرائق لتحقيق ذلك. أو ربما هناك دوم بالفعل طرق لذلك.

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

المحلول

وهناك كائن API غير قياسي: XMLSerializer (وليس القياسية على الرغم من نفذت ولكن في جميع متصفحات IE).

ومنهجه serializeToString يتوقع الكائن DOMNode لتمريرها.

var sXML = new XMLSerializer().serializeToString(document.body);

في إنترنت إكسبلورر لا توجد وسيلة لاسترداد XML المناسب لHTML، ما لم يحصل .outerHTML وإصلاح جميع المشاكل التي تأتي مع التسلسل إلى HTML (مثل يقتبس في سمات وعلامات لم تغلق الخ في عداد المفقودين.)

نصائح أخرى

وسوف يكون لي للنظر في XMLSerializer غدا. هنا هو رمز انتهى بي الأمر كتابة بدلا من ذلك، في حالة أي شخص مهتم (يتطلب النموذج وFirebug ل العقد غير معروف):

function extractXML(node) {
    switch (node.nodeType) {
        case 1: return extractNodeXML(node);
        case 2: return extractAttributeXML(node);
        // 3 = Text node
        case 3: return node.nodeValue;
        // 8 = Comment node - ignore
        case 8: return "";
        case 9: return extractDocumentNodeXML(node);
        case 10: return extractDocumentTypeXML(node);
        default: console.log(node); return "Unkwon type: "+node.nodeType;
    }
}
function extractNodeXML(node) {
    var xml = "<"+node.nodeName;
    $A(node.attributes).each(function (node) {xml += " "+extractXML(node)});
    xml +=">"
    $A(node.childNodes).each(function (node) {xml += extractXML(node)});
    xml += "</"+node.nodeName+">"
    return xml;
}
function extractAttributeXML(node) {
    return node.nodeName+"=\""+node.nodeValue+"\""
}
function extractDocumentNodeXML(node) {
    var xml = "<?xml version=\""+node.xmlVersion+"\" encoding=\""+node.xmlEncoding+"\"?>"
    $A(node.childNodes).each(function (node) {xml += extractXML(node)});
    return xml;
}
function extractDocumentTypeXML(node) {
    return "<!DOCTYPE "+node.name+" PUBLIC \""+node.publicId+"\" \""+node.systemId+"\">"
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top