الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في قراءة ملف XML من SSIS

بدأه mos_tafino في 8 أكتوبر 2012 · 10 رد · 847 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
<?xml version="1.0" encoding="utf-16"?>
<DataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="T">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="ID" type="xs:int" minOccurs="0" />
                <xs:element name="NodeGroup" type="xs:string" minOccurs="0" />
                <xs:element name="NodeCount" type="xs:int" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet>
      <T diffgr:id="T1" msdata:rowOrder="0">
        <ID>648</ID>
        <NodeGroup>Moustord</NodeGroup>
        <NodeCount>5</NodeCount>
      </T>
      <T diffgr:id="T2" msdata:rowOrder="1">
        <ID>646</ID>
        <NodeGroup>Shell</NodeGroup>
        <NodeCount>9</NodeCount>
      </T>
      <T diffgr:id="T3" msdata:rowOrder="2">
        <ID>647</ID>
        <NodeGroup>Suze</NodeGroup>
        <NodeCount>4</NodeCount>
      </T>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

تم تعديل هذه المشاركة بواسطة mos_tafino في 8 أكتوبر 2012 في 19:52

#2

اعتذر عن هذا الخطأ نتيجة عدم تمكني من مساواة السطور بيسار الشاشة و عموما الملف مرفق على انه ملف تكست ممكن تغيروا امتداده ليكون XML

رجاء المساعده

GetGroups.TXT

تم تعديل هذه المشاركة بواسطة mos_tafino في 8 أكتوبر 2012 في 19:39

#3
mos_tafino كتب:

<pre lang="xml"><?xml version="1.0" encoding="utf-16"?>

<DataSet>

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">

<xs:complexType>

<xs:choice minOccurs="0" maxOccurs="unbounded">

<xs:element name="T">

<xs:complexType>

<xs:sequence>

<xs:element name="ID" type="xs:int" minOccurs="0" />

<xs:element name="NodeGroup" type="xs:string" minOccurs="0" />

<xs:element name="NodeCount" type="xs:int" minOccurs="0" />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:choice>

</xs:complexType>

</xs:element>

</xs:schema>

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">

<NewDataSet>

<T diffgr:id="T1" msdata:rowOrder="0">

<ID>648</ID>

<NodeGroup>Moustord</NodeGroup>

<NodeCount>5</NodeCount>

</T>

<T diffgr:id="T2" msdata:rowOrder="1">

<ID>646</ID>

<NodeGroup>Shell</NodeGroup>

<NodeCount>9</NodeCount>

</T>

<T diffgr:id="T3" msdata:rowOrder="2">

<ID>647</ID>

<NodeGroup>Suze</NodeGroup>

<NodeCount>4</NodeCount>

</T>

</NewDataSet>

</diffgr:diffgram>

</DataSet></pre>

يعني بصراحة لو أرسلت الملف نفسو لكان أفضل بكتير :)

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#4

السلام عليكم و رحمة الله و بركاته

أخي العزيز .. يوجد طرق كثيرة لقراء ملف XML إلى SQL Server و منها على سبيل المثال لا الحصر:

1- استخدام إجراءات الـ T-SQL كالإجراء : OpenRowSet و إليك مقال بسيط جداً يوضح كيف تتم العملية:

http://pratchev.blogspot.com/2008/11/import-xml-file-to-sql-table.html

2- استخدام الكائن DataSet في دوت نت لقراء ملف XML و من ثم تفعل ما تريد فعله بالجدول أو الجداول التي تحصل عليها من قراءة ذلك الملف كأن تمر على الأسطر كافة و تقوم بحشرها في قاعدة البيانات عبر الـ SQLCommand .. و إليك مثال على قراء ملف XML إلى كائن DataSet من مايكروسوفت:

http://support.microsoft.com/kb/311566

تحياتي

تم تعديل هذه المشاركة بواسطة imadouzoun في 8 أكتوبر 2012 في 17:14

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#5

اشكرك اخي على الرد و الاهتمام

و لكن انا اريد استخدام SISS لان هذا ملف من اصل 100 ملف يتم جلبهم من الانترنت باستخدام Web Services في ال SISS ثم يتم وضعهم في قاعدة بيانات

و الاهم ان كل هذا اعمل له جدول زمني ليعمل بمفرده دون تدخل من احد

مع العلم باني عملت تطبيق يقرأ هذا الملف كما اقترحت انت بالدوت نت

و لكن كما قلت انا اريد ان تكون العملية كلها من SISS

عموماً ساجرب OpenRowSet ان كانت العملية تتم في قاعدة البيانات فمن الممكن ام اضع العملية الاولي في JOB تنادي على المائة خدمة و تحولهم لملفات XML ثم اتبع ذلك ب job اخرى تعمل الادخال من OpenRowSet

اكرر شكرى و يا ريت لو ممكن المساعدة في في ما قلته في البداية من اني اريد قراءة هذا الملف

مع العلم بان هناك ملفات اخرى يتم قرائتها عدا هذا الملف ؟

#6

هذا كود لملف بسيط و هو يعمل جيدا

هل من الممكن ان يكون التفكير في كيفية تحويل الملف الاول المعقد لهذا الشكل البسيط

    <Products>

      <Product>

        <SKU>1</SKU>

        <Desc>Book</Desc>

      </Product>

      <Product>

        <SKU>2</SKU>

        <Desc>DVD</Desc>

      </Product>

      <Product>

        <SKU>3</SKU>

        <Desc>Video</Desc>

      </Product>

    </Products>
#7

فشلت في استخدام طريقة OPENROWSET

و مرفق الكود ارجو ان يصلح احد الكود لي و غالبا المشكلة في ال Root التي تبين بداية كل صف

و مرفق ايضاً جدول الملف حتى لو اراد احد ان يعمل عليه

الكود

    INSERT INTO GetGroups (ID, NodeGroup, NodeCount)

    SELECT X.T.query('ID').value('.', 'INT'),

           X.T.query('NodeGroup').value('.', 'nvarchar(255)'),

           X.T.query('NodeCount').value('.', 'INT')

    FROM (

    SELECT CAST(x AS XML)

    FROM OPENROWSET(

        BULK 'C:\GetGroups.xml',

        SINGLE_BLOB) AS T(x)

        ) AS T(x)

    CROSS APPLY x.nodes('NewDataSet/T') AS X(T);

اما كود انشاء الجدول فهو

CREATE TABLE [dbo].[GetGroups](
	[ID] [int] NULL,
	[NodeGroup] [nvarchar](255) NULL,
	[NodeCount] [int] NULL
) ON [PRIMARY]

GO

تم تعديل هذه المشاركة بواسطة mos_tafino في 8 أكتوبر 2012 في 20:54

#8

حاولت تعديل كود OPENROWSET

و لكن فشلت ايضاَ

مرفق الكود برجاء التجربة و التعديل

;WITH XMLNAMESPACES( 
	'http://www.w3.org/2001/XMLSchema' AS ns,
	'urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr )

    INSERT INTO GetGroups (ID, NodeGroup, NodeCount)

    SELECT X.T.query('ID').value('.', 'INT'),

           X.T.query('NodeGroup').value('.', 'nvarchar(255)'),

           X.T.query('NodeCount').value('.', 'INT')



    FROM (


    SELECT CAST(x AS XML)

    FROM OPENROWSET(

        BULK 'C:\GetGroups.xml',

        SINGLE_BLOB) AS T(x)

        ) AS T(x)

CROSS APPLY x.nodes('ns:DataSet/diffgr:diffgram/NewDataSet/T')AS X(T);

تم تعديل هذه المشاركة بواسطة mos_tafino في 8 أكتوبر 2012 في 21:39

#9

جربت هذا الكود ايضاً و هو بطريقة تجعل الاصدقاء يساعدون اكثر فهو اسكربت في السيكوال مباشرة يشبه ما كا سابقا من انشاء جدول و قرائه من ملف ال XML

و لكنه لم يعمل ايضا و لكن ممكا تكون التجربه فيه بشكل افضل

كودي الذي لا يعمل فهو كالاتي و امل من مساعدة الاصدقاء فيه

DECLARE @xml XML

SET @xml = '<DataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="T">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="ID" type="xs:int" minOccurs="0" />
                <xs:element name="NodeGroup" type="xs:string" minOccurs="0" />
                <xs:element name="NodeCount" type="xs:int" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet>
      <T diffgr:id="T1" msdata:rowOrder="0">
        <ID>648</ID>
        <NodeGroup>Moustord</NodeGroup>
        <NodeCount>5</NodeCount>
      </T>
      <T diffgr:id="T2" msdata:rowOrder="1">
        <ID>646</ID>
        <NodeGroup>Shell</NodeGroup>
        <NodeCount>9</NodeCount>
      </T>
      <T diffgr:id="T3" msdata:rowOrder="2">
        <ID>647</ID>
        <NodeGroup>Suze</NodeGroup>
        <NodeCount>4</NodeCount>
      </T>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>'


;WITH XMLNAMESPACES( 
	'http://www.w3.org/2001/XMLSchema' AS ns,
	'urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr )
SELECT 
	fd.c.value('(ID/text())[1]', 'INT') 'a',
	fd.c.value('(NodeGroup/text())[1]', 'nvarchar(255)') 'b',
	fd.c.value('(NodeCount/text())[1]', 'INT') 'c'

FROM @xml.nodes('ns:DataSet/diffgr:diffgram/NewDataSet/T') fd(c)

مع ملاحظة انني استنبطت هذا الكود من كود يعمل بكفائة و هو

DECLARE @xml XML

SET @xml = '<DataSet xmlns="http://yourNamespaceHere">
  <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
   <!--...-->
   </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
      <FolderData diffgr:id="FC337" msdata:rowOrder="336">
        <A>A content</A>
        <B>B content</B>
        <C>20120401</C>
        <D>D content</D>
        <E>E content</E>
      </FolderData>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>'


;WITH XMLNAMESPACES( 
	'http://yourNamespaceHere' AS ns,
	'urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr )
SELECT 
	fd.c.value('(A/text())[1]', 'NVARCHAR(31)') 'a',
	fd.c.value('(B/text())[1]', 'NVARCHAR(31)') 'b',
	fd.c.value('(C/text())[1]', 'DATETIME') 'c',
	fd.c.value('(D/text())[1]', 'NVARCHAR(10)') 'd',
	fd.c.value('(E/text())[1]', 'NVARCHAR(100)') 'e'	
FROM @xml.nodes('ns:DataSet/diffgr:diffgram/NewDataSet/FolderData') fd(c)

تم تعديل هذه المشاركة بواسطة mos_tafino في 9 أكتوبر 2012 في 09:08

#10

ليس بالامر السهل افضل عمل برنامج يقرء الWeb Service ويخزنها في قاعدة البيانات

#11

بفضل الله تم حل المشكلة

بعد ان قمت بعتديل اخر سطر من

FROM @xml.nodes('ns:DataSet/diffgr:diffgram/NewDataSet/FolderData') fd(c)

الى

FROM @xml.nodes('DataSet/diffgr:diffgram/NewDataSet/FolderData') fd(c)

شكرا لكل من تفاعل معي و جزاكم الله خير و مرفق الكود كله الذي وضعته في Job تتحدث باستمرار بعد جلب ملف ال XML عن طريق ال SSIS و بالتالي الامر كله تم من قاعدة البيانات دون اللجؤ لتطبيق دوت نت... و اعتقادي بان هذا الامر اسرع بكثير و بوضع جدول زمني للوظيفه ستتحدث هذه البيانات باستمرار و كان هذا ما اتمناه

 SET QUOTED_IDENTIFIER ON
 ;WITH XMLNAMESPACES( 'urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr )

 INSERT INTO GetGroups (ID, NodeGroup, NodeCount)

    SELECT X.T.query('ID').value('.', 'INT'),

           X.T.query('NodeGroup').value('.', 'nvarchar(255)'),

           X.T.query('NodeCount').value('.', 'INT')

    FROM (

    SELECT CAST(x AS XML)

    FROM OPENROWSET(

        BULK 'C:\GetGroups.xml',

        SINGLE_BLOB) AS T(x)

        ) AS T(x)

    CROSS APPLY x.nodes('DataSet/diffgr:diffgram/NewDataSet/T') AS X(T);

تم تعديل هذه المشاركة بواسطة mos_tafino في 9 أكتوبر 2012 في 11:04

مواضيع مشابهة