Сведения о вопросе

PASHA

03:58, 13th August, 2020

Теги

xml   unix   parsing   shell   csv    

Парсинг XML с использованием unix terminal

Просмотров: 430   Ответов: 7

Иногда мне нужно быстро извлечь некоторые произвольные данные из файлов XML, чтобы поместить их в формат CSV. Каковы ваши лучшие практики для этого в Unix terminal? Я хотел бы получить некоторые примеры кода, так например, как я могу решить следующую проблему?

Пример ввода XML:

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

Мой желаемый результат CSV :

Foo,
Bar,



  Сведения об ответе

FAriza

02:40, 14th August, 2020

Ответ Питера верен ,но он выводит канал Линии trailing.

<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 в стандартный вывод.


  Сведения об ответе

ITSME

06:38, 25th August, 2020

Используйте процессор командной строки XSLT, такой как xsltproc , saxon или 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>


  Сведения об ответе

SSESION

19:01, 12th August, 2020

XMLStarlet-это набор инструментов командной строки для query/edit/check/transform 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/@name что обеспечит два значения атрибутов.

Очень удобный инструмент.


  Сведения об ответе

DO__IT

13:20, 22nd August, 2020

Если вам просто нужны атрибуты имени любого элемента, вот быстрое, но неполное решение.

(Ваш пример текста находится в файле example )

grep "name" пример / cut-d " \ "" - f2, 2 | команды xargs -I{} Эхо "{},"


  Сведения об ответе

crush

22:47, 28th August, 2020

Вот небольшой скрипт ruby, который делает именно то, что спрашивает ваш вопрос (вытяните атрибут с именем 'name' из элементов с именем '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'] }


  Сведения об ответе

#hash

13:11, 19th August, 2020

Отвечая на исходный вопрос, предположим, что файл xml - это "test.xml", который содержит:

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

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


  Сведения об ответе

KOMP

20:46, 16th August, 2020

ваш тестовый файл находится в test.xml.

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

У него есть свои подводные камни, например, если он не строго задан, что каждый myel находится на одной строке, вы должны "normalize" файл xml сначала (так что каждый myel находится на одной отдельной строке)



Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться