كيفية تجاهل التحقق من صحة علامات غير معروفة؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

تحد واحد آخر لقدرة XSD،

لقد قمت بإرسال ملفات XML من قبل عملائي، والتي ستكون تواجه 0 أو أكثر undefined أو [استدعاء] علامات غير متوقعة (قد تظهر في التسلسل الهرمي). حسنا، إنها علامات زائدة عن الحاجة بالنسبة لي .. لذلك يجب أن أتجاهل وجودها، ولكن معهم هناك مجموعة من العلامات التي يتعين التحقق منها.

هذه هي عينة XML:

<root>
  <undefined_1>one</undefined_1>
  <undefined_2>two</undefined_2>
  <node>to_be_validated</node>
  <undefined_3>two</undefined_3>
  <undefined_4>two</undefined_4>
</root>

و XSD حاولت مع:

  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType

XSD لا يسمح بذلك، بسبب أسباب معينة.
المثال المذكور أعلاه هو مجرد عينة. يأتي XML العملي مع التسلسل الهرمي المعقد لعلامات XML ..

يرجى إعلامي إذا كنت تستطيع الحصول على اختراق منه.

بالمناسبة، الحل البديل هو إدراج تحويل XSL، قبل عملية التحقق من الصحة. حسنا، أنا أتجنب ذلك لأنني بحاجة إلى تغيير رمز .NET الذي يؤدي إلى تشغيل عملية التحقق من الصحة، والتي يتم دعمها على الأقل من شركتي.

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

المحلول 2

خاتمة:

هذا غير ممكن مع XSD. تم تسمية جميع الأساليب التي كنت أحاول تحقيقها على أنها "غامضة" عن طريق أدوات التحقق من الصحة، ومجموعة من الأخطاء.

نصائح أخرى

في حالة عدم القيام بذلك بالفعل مع هذا، قد تحاول ما يلي:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

تحت Linux هذا يعمل بشكل جيد مع XMLLINT باستخدام Libxml الإصدار 20706.

ربما يكون من الممكن استخدام مساحات الأسماء:

<xs:element name="root" type="root"></xs:element> 
  <xs:complexType name="root"> 
    <xs:sequence> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
      <xs:element name="node" type="xs:string"/> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
  </xs:complexType>

هذا سوف يتحقق من الصحة.

أنا واجهت نفس المشكلة.

منذ دعا التحقق من الصحة من .NET؛ قررت قمع خطأ التحقق من الصحة المحدد في ValidationEventHandler كحل. عملت معي.

    private void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Warning:
                // Processing warnings
                break;
            case XmlSeverityType.Error:
                if (IgnoreUnknownTags
                    && e.Exception is XmlSchemaValidationException
                    && new Regex(
                        @"The element '.*' has invalid child element '.*'\."
                        + @" List of possible elements expected:'.*'\.")
                       .IsMatch(e.Exception.Message))
                {
                    return;
                }
                // Processing errors
                break;
            default:
                throw new InvalidEnumArgumentException("Severity should be one of the valid values");
        }
    }

من المهم أن Thread.CurrentUICulture يجب أن تضع على اللغة الإنجليزية أو CultureInfo.InvariantCulture بالنسبة للخيط الحالي لهذا العمل.

يمكنك الاستفادة من ميزة جديدة في XML 1.1 يسمى "محتوى مفتوح". باختصار، يسمح لك بتحديد العناصر الإضافية "غير المعروفة" يمكن إضافتها إلى نوع معقد في مواقع مختلفة وما يجب أن يفعله المحلل اللوحيين إذا كان يضرب أي من هذه العناصر

باستخدام XML 1.1، سيصبح نوعك المعقد:

<xs:element name="root" type="root" />
<xs:complexType name="root"> 
  <xs:openContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:openContent>

  <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
  </xs:sequence> 
</xs:complexType>

إذا كان لديك الكثير من الأنواع المعقدة، يمكنك أيضا تعيين وضع محتوى مفتوح "افتراضي" في الجزء العلوي من المخطط الخاص بك:

<xs:schema ...>
  <xs:defaultOpenContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:defaultOpenContent>

  ...
</xs:schema>

يمكن العثور على المواصفات W3C للمحتوى المفتوح في http://www.w3.org/tr/xmlschema11-1/# - وهناك كتابة جيدة لهذا في http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA..

لسوء الحظ، لا يدعم .NET دعم XML 1.1 حتى الآن لا يمكنني العثور على أي معالجات مجانية XML 1.1 - لكن زوجين مدفوعين للخيارات هي:

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