سؤال

لدي مجموعة من البيانات المخزنة في XDocuments وDataTables، وأود التعامل مع كليهما كمساحة بيانات موحدة واحدة مع استعلامات XPath.لذلك، على سبيل المثال، "/Root/Tables/Orders/FirstName" سيؤدي إلى جلب قيمة عمود الاسم الأول في كل صف من DataTable المسمى "Orders".

هل هناك طريقة للقيام بذلك دون نسخ كافة السجلات الموجودة في DataTable إلى XDocument؟

أنا أستخدم .Net 3.5

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

المحلول 2

لقد اكتشفت في النهاية الإجابة على هذا بنفسي.لقد اكتشفت فئة في System.Xml.LINQ تسمى XStreamingElement يمكنها إنشاء بنية XML بشكل سريع من تعبير LINQ.فيما يلي مثال على إرسال DataTable إلى مساحة XML.

Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
    from t in Tables
    select new XStreamingElement(t.Key,
               from DataRow r in t.Value.Rows
               select new XStreamingElement("row",
                          from DataColumn c in t.Value.Columns
                          select new XElement(c.ColumnName, r[c])))))

والنتيجة هي XElement (TableRoot) مع بنية مشابهة لما يلي، على افتراض أن القاموس يحتوي على جدول واحد يسمى "Orders" مع صفين.

<Tables>
    <Orders>
        <row>
            <sku>12345</sku>
            <quantity>2</quantity>
            <price>5.95</price>
        </row>
        <row>
            <sku>54321</sku>
            <quantity>3</quantity>
            <price>2.95</price>
        </row>
    </Orders>
</Tables>

يمكن دمج ذلك مع تسلسل هرمي أكبر يعتمد على XElement/XDocument والاستعلام عنه باستخدام XPath.

نصائح أخرى

تعمل عناصر .NETs XPath على واجهة IXPathNavigable.يحتوي كل IXPathNavigable على أسلوب CreateNavigator() الذي يُرجع IXPathNavigator.

من أجل الكشف عن جميع مصادر البيانات الخاصة بك كمستند واحد كبير، ستحتاج إلى إنشاء فئة تطبق IXPathNavigable، تحتوي على جميع مصادر بيانات xpath.يجب أن يقوم الأسلوب CreateNavigator بإرجاع XPathNavigator مخصص يعرض المحتويات كمصدر بيانات كبير واحد.

لسوء الحظ، يعد تنفيذ هذا المتصفح أمرًا صعبًا إلى حد ما، ويجب توخي الحذر خاصة عند التنقل بين المستندات،

هل تبحث عن شيء مماثل لما سألت عنه مفاتيح XPath الخارجية?

كما تقول توصية XPath ، "الغرض الأساسي من XPath هو معالجة أجزاء من مستند XML." ليس لديها أي منشأة لمعالجة أجزاء من أكثر من مستند XML واحد.سيتعين عليك إنشاء مستند XML واحد إذا كنت تريد القيام بما تحاول القيام به.

سيكون عليك دمج مستنداتك، أو على الأقل إجراء نفس التحويلات على جميع مستنداتك.قد تفكر في نقل مستنداتك إلى DataTable واحد، ثم تصفية DataTable إذا لم يكن XPath / XSLT ممكنًا.

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