سؤال

أحيانا تحتاج إلى بسرعة استخراج بعض التعسفي البيانات من ملفات XML إلى وضعها في تنسيق CSV.ما هي أفضل الممارسات من أجل القيام بذلك في Unix المطار ؟ أنا أحب بعض أمثلة التعليمات البرمجية ، على سبيل المثال كيف يمكنني الحصول على المشكلة التالية حلها ؟

مثال XML الإدخال:

<root>
<myel name="Foo" />
<myel name="Bar" />
</root>

المطلوب CSV الناتج:

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

المحلول

إذا كنت ترغب فقط في اسم سمات أي عنصر هنا هو وسيلة سريعة ولكن غير مكتملة الحل.

(المثال الخاص بك النص في الملف على سبيل المثال)

البقرى "اسم" المثال | cut -d"\"" -f2 ، 2 | xargs -أنا{} echo "{},"

نصائح أخرى

بطرس الإجابة هو الصحيح, ولكن من النواتج زائدة خط تغذية.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"/>
  <xsl:template match="root">
    <xsl:for-each select="myel">
      <xsl:value-of select="@name"/>
      <xsl:text>,</xsl:text>
      <xsl:if test="not(position() = last())">
        <xsl:text>&#xA;</xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

تشغيل فقط على سبيل المثال

xsltproc stylesheet.xsl source.xml

إلى توليد نتائج CSV إلى الإخراج القياسي.

استخدام سطر الأوامر XSLT المعالج مثل xsltproc, سكسونية أو xalan تحليل XML وتوليد CSV.هنا مثال, التي قضيتك هي الأنماط:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="root">
        <xsl:apply-templates select="myel"/>
    </xsl:template>

    <xsl:template match="myel">
        <xsl:for-each select="@*">
            <xsl:value-of select="."/>
            <xsl:value-of select="','"/>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:template> 
</xsl:stylesheet>

XMLStarlet هو سطر الأوامر أدوات الاستعلام/تحرير/تحقق/تحويل مستندات XML (لمزيد من المعلومات انظر http://xmlstar.sourceforge.net/)

لا ملفات الكتابة فقط الأنابيب ملفك إلى xmlstarlet و تطبيق xpath التصفية.

cat file.xml | xml sel -t -m 'xpathExpression' -v 'elemName' 'literal' -v 'elname' -n

م التعبير -v القيمة "شملت الحرفي -n سطر جديد

حتى xpath xpath التعبير سيكون //myel/@اسم التي من شأنها أن توفر اثنين من قيم السمة.

أداة قوية جدا.

هنا هو القليل من روبي النصي الذي لم بالضبط ما السؤال يسأل عن (سحب سمة يسمى "الاسم" من عناصر ما يسمى 'myel').ينبغي أن يكون من السهل التعميم

#!/usr/bin/ruby -w

require 'rexml/document'

xml = REXML::Document.new(File.open(ARGV[0].to_s))
xml.elements.each("//myel") { |el| puts "#{el.attributes['name']}," if el.attributes['name'] }

الإجابة على السؤال الأصلي ، على افتراض ملف xml "test.xml" الذي يحتوي على:

<root> <myel name="Foo" /> <myel name="Bar" /> </root>

cat text.xml | tr -s "\"" " " | awk '{printf "%s,\n", $3}'

ملف الاختبار في test.xml.

sed -n 's/^\s`*`&lt;myel\s`*`name="\([^"]`*`\)".`*`$/\1,/p' test.xml

أنها المزالق ، على سبيل المثال إذا لم يكن بدقة بالنظر إلى أن كل myel على خط واحد لديك إلى "تطبيع" ملف xml الأول (لذلك كل myel على سطر منفصل)

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