преобразуйте xml в csv

я разрешил его путем установки окон 7 сначала только с одним разделом т.е. C:. затем установленный Fedora 20 и перезагруженный в окна 7. Используя управление дисками я создал другие два раздела. Благодаря @Robin Green для его поддержки.

2
18.11.2018, 19:42
3 ответа

OK. Здесь есть довольно фундаментальная проблема. XML является сложным языком с подробным спецификацией. Без библиотек это сложно - XML ​​довольно принципиально вещь, которая нуждается в правильном разборе.

Так что, например, использование XML :: Twig с Perl, вы получите:

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new()->parsefile ( 'your_xml_file.xml' );

print "id_localisation;id_client;key\n";
foreach my $record ( $twig->root->children('record') ) {
    foreach my $data ( $record->children('data') ) {
        print join( ";",
            $record->first_child_text('id_localisation'),
            $data->first_child_text('id_client'),
            $data->first_child_text('key'),
            ),
            "\n";
    }
}

Вы можете найти, что XML :: Twig уже доступен - это довольно распространенно «По умолчанию установка». Так что проведите это сначала.

Существует грязный вид хаки для этого, но я действительно не рекомендовал бы сделать это. Я имею в виду действительно действительно, потому что он делает хрупкий и ужасный код.

Я не могу подтвердить это в любых более сильных условиях. Прежде чем сделать это, посмотрите на: https://stackoverflow.com/a/1732454/2566198

и: https://stackoverflow.com/a/28913945/2566198

Обратите внимание, что вы можете установить модули Perl «на пользователя» в определенные обстоятельства, которые могут быть особенно актуальными здесь.

И признайте, что ваш код сознательно нарушает спецификацию XML - обрабатывая его в качестве текстового файла. Это все виды плохого juju, не в последнюю очередь, потому что есть некоторые совершенно действительные вещи, которые вы можете сделать с XML, что сломает это.

Однако, если вы абсолютно должны:

use strict;
use warnings;

open ( my $input_xml, "<", 'your_xml_file.xml' ) or die $!;
my $loca = "";
print "id_localisation;id_client;key\n";

for (<$input>) {
    my ($value) = (m/>(\w+)</);
    if (m/id_localisation/) { $loca = $value; }
    if (m/id_client/)       { print "$loca;$value;"; }
    if (m/key/)             { print "$value\n"; }
}
close($input);

, который будет печать:

id_localisation;id_client;key
8PJ;50C;C
8PJ;25C;D1
ESP31;70D;D2
ESP31;10D;D3

, если вы планируете использовать это для любой функции производства, то сначала спешите, кто не позволит вам установить вещи и получить их для установки библиотеки, которые вам нужны. Это может звучать как тяжелую работу, но поверь мне - нет ничего хуже, чем пытаться устранить неисправность то, что загадочно сломало один день, потому что формат передачи данных изменился (в специфическом сценарии не реализует стандарт.

2
27.01.2020, 22:05

Я бы предложил бы использовать XSL-файл

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output type="text" indent="yes" omit-xml-declaration="yes" />

<xsl:template match="//record">

<xsl:for-each select="data"  >
<xsl:value-of select="../id_localisation" />;<xsl:value-of select="id_client" />;<xsl:value-of select="key "/><xsl:text>;
</xsl:text>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

для использования с

xsltproc sample.xsl sample.xml
1
27.01.2020, 22:05

Используйте lxprintf из набора инструментов ltXML2 (Эдинбургский университет), например:

$ lxprintf -e data "%s;%s;%s\n" ../id_localisation id_client key test.xml
8PJ;50C;C
8PJ;25C;D1
ESP31;70D;D2
ESP31;10D;D3

Использование XSLT2 это нормально, но слишком много для такого извлечения.


XML FAQ: http://xml.silmaril.ie/

0
27.01.2020, 22:05

Теги

Похожие вопросы