تحويل الملف المسطح إلى XML باستخدام تقنية تشبه XSLT

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

سؤال

أقوم بتصميم نظام يتلقى البيانات من عدد من الشركاء على شكل ملفات CSV.قد تختلف الملفات في عدد الأعمدة وترتيبها.بالنسبة للجزء الأكبر، سأرغب في اختيار مجموعة فرعية من الأعمدة، وربما إعادة ترتيبها، وتسليمها إلى المحلل اللغوي.من الواضح أنني أفضل أن أكون قادرًا على تحويل البيانات الواردة إلى تنسيق أساسي لجعل المحلل اللغوي بسيطًا قدر الإمكان.

من الناحية المثالية، أود أن أكون قادرًا على إنشاء تحويل لكل تنسيق بيانات وارد باستخدام بعض الأدوات الرسومية وتخزين التحويل كمستند في قاعدة بيانات أو على قرص.عند استلام البيانات، سأقوم بتطبيق التحويل الصحيح (ناهيك عن كيفية تحديد التحويل الصحيح) للحصول على مستند XML بتنسيق أساسي.إذا كانت الملفات الواردة تحتوي على XML لكنت قد قمت بإنشاء مستند XSLT لكل تنسيق وكنت في طريقي.

لقد استخدمت BizTalk's Flat File XSLT Extensions (أو أيًا كان اسمها) لشيء مماثل في الماضي، لكنني لا أريد متاعب BizTalk (ولا أستطيع تحمل تكاليفها أيضًا) في هذا المشروع.

هل يعرف أحد ما إذا كانت هناك تقنيات بديلة و/أو امتدادات XSLT ستمكنني من تحقيق هدفي بطريقة أنيقة؟

أقوم بتطوير تطبيقي بلغة C# على .NET 3.5 SP1 (وبالتالي أفضّل التقنيات التي يدعمها .NET).

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

المحلول

وXSLT يوفر الميزات الجديدة التي تجعل من السهل تحليل الملفات غير XML.

شارك

وأندرو وولش على XSLT 2.0 المثال الذي يحول CSV إلى XML

نصائح أخرى

وأعتقد أنك تحتاج إلى شيء من هذا القبيل (آسف، لا تدعمها. NET لكن كود بسيط جدا)

http://csv2xml.sourceforge.net

قام شخص ما IIRC بإنشاء مكتبة "LINQ إلى CSV" والتي قد تكون نقطة بداية لإنشاء XML الوسيط (في الذاكرة) كمدخل في التحويل.

وجدته هنا.

وكنت قد تحاول LINQ إلى CSV. هناك عرض واحد من مايكروسوفت <لأ href = "http://blogs.msdn.com/ericwhite/archive/2008/09/30/linq-to-text-and-linq-to-csv.aspx" يختلط = " نوفولو noreferrer "> اريك الأبيض وآخر من مات Perdeck . البعض الآخر من هناك ...

لقد وجدت حلين محتملين عند النظر في مساحة مشكلة مماثلة.

يحتوي برنامج Progress على مجموعة من الأدوات وواجهة برمجة التطبيقات (.Net)، والتي عند استخدامها بالاقتران مع ملفات .conv (محول مسطح إلى XML) التي تم إنشاؤها في أداة Stylus Studio الخاصة بهم، تسمح بتحويل أي تنسيق ملف ثابت محدد مسبقًا إلى XML عند التشغيل وقت.مزيد من المعلومات هنا: http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

بالإضافة إلى ذلك، يوجد تنسيق XML يسمى XFLAT والذي يسمح بوصف الملفات المسطحة في مجموعة متنوعة من التنسيقات، محددة، ذات عرض ثابت وما إلى ذلك...يوجد برنامج جافا يقوم بتحويل الملفات المسطحة، حيث قمت بتقديم وصف XFLAT إلى XML بحيث يمكنك الاستمرار في تحويل XML القياسي إلى XML XSLT.مزيد من التفاصيل يمكن العثور عليها هنا: http://www.unidex.com/overview.htm

لم أستخدم مطلقًا أيًا من هاتين الأداتين، لكنني وجدتهما عند البحث عن مشكلة مماثلة.

الدفع هذا المقال بشأن تنفيذ XmlReader الذي يعالج مدخلات غير XML.إنها ليست مهمة صعبة للغاية، وبمجرد الانتهاء منها، لن تحتاج إلى استخدام تقنية تشبه XSLT، يمكنك فقط استخدام XSLT.

وهذا سوف تحليل الإخراج من لينكس الملكية الفكرية القائمة الطريق الأوامر. انها مجرد ما كنت قد زرع حولها.

ويجب التفاف الإخراج من القيادة: في عنصر يسمى "الناتج" ورقة نمط سوف أعتبر من هناك. المفتاح الحقيقي هنا هو الأمر tokenize في كسباث 2.0 المواصفات. أنا لا أعرف كيف يمكن أن تفعل هذا قبل ذلك. أيضا هذا لا يجعل عنصر جذر واحد، لأن ذلك لم يكن هو ما أحتاجه من أجله. في الحالة الخاصة بك، بدلا من ذلك انشقاق في الفضاء، رقم spli على '،'

<?xml version="1.0" encoding="UTF-8"?>

<xsl:output method="xml" indent="yes" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="//output">
    <!-- split things up for each new line -->
    <xsl:variable name="line" select="tokenize(.,'\n')"/>
    <xsl:for-each select="$line">                        
        <!-- split each line into peices based on space -->
        <xsl:variable name="split" select="tokenize(.,' +')"/>
        <xsl:if test="count($split) &gt; 1">
            <xsl:element name="route">                                        
                <xsl:for-each select="$split">
                    <xsl:choose>
                        <xsl:when test="position() = 1">
                            <xsl:attribute name="address" select="."/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:variable name="index" select="position()"/>
                            <xsl:variable name="fieldName" select="."/>
                            <xsl:if test="$fieldName and position() mod 2 = 0">
                                <xsl:attribute name="{$fieldName}" select="$split[$index + 1]"/>
                            </xsl:if>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:element>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

ويمكنك أيضا أن تأخذ نظرة على التوفا في مابفورسي

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