كيف يمكنني إلغاء كيانات XML بسهولة في .NET

لدي بعض التعليمات البرمجية التي تقوم بإرجاع InnerXML لـ XMLNode.

يمكن أن تحتوي العقدة على بعض النصوص فقط (مع HTML) أو XML.

فمثلا:


    Here is some <strong>HTML</strong>

أو


    Here is some content

if I get the InnerXML fأو the HTML tags are returned as xml entities.

I cannot use InnerText because I need to be able to get the xml contents. So all I really need is a way to un-escape the HTML tags, because I can detect if it's xml أو not and act accأوdingly.

أعتقد أنه يمكنني استخدام HTMLDecode ، ولكن هل سيقوم هذا فك تشفير جميع الكيانات المشفرة XML؟

Update: I guess I'm rambling a bit above so here is a clarified scenario:

لدي مستند xml يبدو كالتالي:


    <p>A Test</p>


    
        A test
    

إذا فعلت:

XmlNode xn1 = document.SelectSingleNode("/content[@id=1]/data");
XmlNode xn2 = document.SelectSingleNode("/content[@id=2]/data");

Console.WriteLine(xn1.InnerXml);
Console.WriteLine(xn2.InnerXml);    

سوف يعود xn1

 <p>A Test</p>

xn2 will return A test

أنا أتحقق بالفعل لمعرفة ما إذا كان ما يتم إرجاعه هو xml (في حالة xn2) لذا كل ما أحتاج إليه هو عدم الإفلات من & lt؛ إلخ في xn1.

HTMLDecode does this, but I'm not sure it would wأوk fأو everything. So the question remains would HTMLDecode handle all the possible entities أو is there a class somewhere that will do it fأو me.

2

3 إجابة

سؤالك يصعب قليلاً. إليك الأشياء التي لم أفهمها تمامًا:

  1. إذا كنت تستخدم كائنات XmlNode/XmlElement ، فأنت تعمل باستخدام xml ، وليس HTML. لذلك كل ما يمكن أن يكون لديك عناصر XML. قد يكون لها أسماء عناصر HTML ، ولكنها هي XML.
  2. يعرض InnerXml سلسلة ، على الأقل لكائن XmlElement. ما الذي تعمل به؟
  3. ما البيانات التي تتوقع أن تخرجها من العملية؟ هل يمكنك إعطاء مثال على ما تحتاج إليه؟
  4. ما الذي تنوي فعله بالضبط مع البيانات عندما يكون لديك؟ ربما هناك طريقة أفضل لهدفك أكثر من ما يدور في ذهنك؟

تعديل </قوي>

أعتقد أنني أحصل على الصورة ، لكن صححني إذا ما زلت مخطئًا. أنت تريد أن تنفصل "

A Test

" من xn1 ، ولكن "A test" من xn2 </القانون>.

لذا InnerXml هو الطريق للذهاب xn1 ، و InnerText سيكون صحيحًا بالنسبة xn2 .

حسناً ، قم بهذه الطريقة إذن - اختبر وجود dataitem وحدد ماذا تفعل عندما تعرف.

XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");

if (xn.SelectSingleNode("dataitem") == null)
  Console.WriteLine(xn.InnerXml);
else
  Console.WriteLine(xn.InnerText);

للإجابة على سؤالك بشأن HttpUtility.HtmlDecode ، نظرت للتو في التطبيق ويبدو أنه سيعمل "لكل شيء" ، ولكن يبدو لي أنه لزوم إذا كانت السلسلة التي تبحث عنها من InnerXml .

2
وأضاف

لماذا لا ندخلها كعلامة & lt؛ و & gt؛ ؟ يمكنك تجنب خلط xml وأشياء الترميز المخصصة مع هذا ...

2
وأضاف
هذه استجابة صالحة ، المثال المقدم في السؤال هو xml غير صالح
وأضاف المؤلف Mitchel Sellers, مصدر
لقد قمت بتحديث المثال لإصلاح بناء جملة غير صحيح. هذه الإجابة ليست في الواقع إجابة ذات صلة بالسؤال ، لكنني أقبل مثالى كان سيئًا.
وأضاف المؤلف Tim Saunders, مصدر

أعتقد أن تومالاك يسير على الطريق الصحيح ، لكنني سأكتب الشفرة بطريقة مختلفة قليلاً:

        XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");
        if (xn.ChildNodes.Count != 1)
        {
            throw new InvalidOperationException("I don't know what to do if there's not exactly one child node.");
        }
        XmlNode child = xn.ChildNodes[0];
        switch (child.NodeType)
        {
            case XmlNodeType.Element:
                Console.WriteLine(xn.InnerXml);
                break;
            case XmlNodeType.Text:
                Console.WriteLine(xn.Value);
                break;
            default:
                throw new InvalidOperationException("I can only handle elements and text nodes.");
        }

يجعل هذا الرمز الكثير من افتراضاتك الضمنية صريحة ، وعندما تصادف بيانات غير موجودة بالشكل الذي تتوقعه ، فسوف يخبرك عن سبب فشله.

1
وأضاف