سؤال

لقد حصلت على ملف .xml الذي أحتاج إلى قراءته في الكود الخاص بي كمجموعة بيانات (كخلفية، تم إنشاء الملف عن طريق إنشاء ملف DataSet في C # والاتصال dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema), ولكن تم ذلك من قبل شخص آخر).

تم تشكيل ملف .xml على النحو التالي:

 <?xml version="1.0" standalone="yes"?>
 <NewDataSet>
  <Foo>
    <Bar>abcd</Bar>
    <Foo>efg</Foo>
  </Foo>
  <Foo>
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>
  </Foo>
</NewDataSet>

باستخدام C# و.NET 2.0، قرأت الملف باستخدام الكود أدناه:

        DataSet ds = new DataSet();
        ds.ReadXml(file);

باستخدام نقطة توقف، بعد هذا line ds.Tables[0] يبدو هكذا (باستخدام الشرطات بدلاً من الشرطات السفلية التي لم أتمكن من تنسيقها بشكل صحيح):

Bar     Foo-Id    Foo-Id-0
abcd     0         null
null     1         0
hijk     2         null
null     3         2

لقد وجدت حلاً بديلاً (أعلم أن هناك الكثير) وتمكنت من قراءته بنجاح في ملف .xml، ولكن ما أود أن أفهمه هو السبب ds.ReadXml(file) بهذه الطريقة، لذا سأتمكن من تجنب المشكلة في المستقبل.شكرًا.

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

المحلول

يبدو أن هذا صحيح بالنسبة لك متداخلة علامات فو:

<NewDataSet>  
  <Foo>              <!-- Foo-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   <!-- Foo-Id: 1, Parent-Id: 0 -->
  </Foo>
  <Foo>              <!-- Foo-Id: 2 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   <!-- Foo-Id: 3, Parent-Id: 2 -->
  </Foo>
</NewDataSet>

لذلك يصبح هذا بشكل صحيح 4 سجلات في النتيجة، مع مفتاح الوالدين والطفل لـ "Foo-Id-0"

يحاول:

<NewDataSet>  
  <Rec>              <!-- Rec-Id: 0 -->
    <Bar>abcd</Bar>
    <Foo>efg</Foo>   
  </Rec>
  <Rec>              <!-- Rec-Id: 1 -->
    <Bar>hijk</Bar>
    <Foo>lmn</Foo>   
  </Rec>
</NewDataSet>

مما ينبغي أن يؤدي إلى:

Bar     Foo        Rec-Id
abcd    efg        0
hijk    lmn        1

نصائح أخرى

هذه ملاحظاتي وليست إجابة كاملة:

تخميني (دون محاولة إعادة إنتاجه بنفسي) هو أن بعض الأشياء قد تحدث عندما تحاول مجموعة البيانات "تسوية" البنية الهرمية إلى بنية بيانات علائقية.

1) التفكير في البيانات من منظور قاعدة البيانات العلائقية؛لا يوجد حقل مفتاح أساسي واضح لتحديد كل عنصر من عناصر Foo في المجموعة، لذا استخدمت DataSet تلقائيًا الموضع الترتيبي في الملف كحقل تم إنشاؤه تلقائيًا يسمى Foo-Id.

2) يوجد في الواقع عنصران يسمى "Foo" لذا ربما يفسر ذلك إنشاء اسم غريب للعمود "Foo-Id-0" (لقد تم إنشاء اسم فريد تلقائيًا للعمود - أعتقد أنه يمكنك التفكير في هذا باعتباره سلوكًا متسامحًا مع الأخطاء في DataSet).

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