Скрипт для загрузки XML и создания нового с помощью XPath

У меня есть файл xml, который обновляется каждые несколько часов платформой электронной коммерции. Я хотел бы создать отдельный файл xml с фильтром xpath.

Код XPath состоит из одной строки.

Какой язык я должен использовать для создания этого xml? Где я могу найти любой шаблон, чтобы заставить его работать?

Итак, я получил этот xml-файл:

 <o id="17" url="url" price="15.00" avail="1" weight="0" stock="3" set="0" 
 basket="0">
 <cat><![CDATA[ category ]]></cat>
 <name><![CDATA[ name ]]></name>
 <imgs><main url="url"/></imgs>
 <desc><![CDATA[description]]></desc>
 <attrs><a name="text"><![CDATA[ Dev ]]></a>
 <a name="Code"><![CDATA[ ]]></a>
 <a name="EAN"><![CDATA[ EAN ]]></a>
 </attrs>

 <o id="18" url="url" price="15.00" avail="1" weight="0" stock="3" set="0" 
 basket="0">
 <cat><![CDATA[ category2 ]]></cat>
 <name><![CDATA[ name ]]></name>
 <imgs><main url="url"/></imgs>
 <desc><![CDATA[description]]></desc>
 <attrs><a name="text"><![CDATA[ Dev ]]></a>
 <a name="Code"><![CDATA[ ]]></a>
 <a name="EAN"><![CDATA[ EAN ]]></a>
 </attrs>

Существует много категорий продуктов, но мне нужны в отдельном xml только продукты из «категории 2» со всей структурой продукта. Я нашел это, чтобы сделать это вручную:

//o[normalize-space(cat) = 'category2']

Файл обновления платформы каждые несколько часов с новыми продуктами. Поэтому я хотел бы, чтобы скрипт загружал этот файл, автоматически генерировал новый xml только с категорией 2.


person Fenixq    schedule 25.09.2019    source источник
comment
Ваш вопрос очень неточен, поэтому он не будет стимулировать много ответов. Если я правильно понимаю, вы ищете инструмент для извлечения частей из файла xml и преобразования его в какой-либо другой xml. Обычным инструментом для этой работы является таблица стилей xslt, запускаемая процессором xslt. Библиотека libxml — это еще один широко распространенный интерфейс для чтения и записи данных xml, который имеет привязки практически ко всем известным мне средам программирования. Без дополнительной информации о настройках, в которых вы работаете, нет разумного способа посоветовать вам язык/набор инструментов. Кстати: XPath не является языком программирования.   -  person collapsar    schedule 25.09.2019
comment
я отредактировал сообщение с дополнительной информацией   -  person Fenixq    schedule 25.09.2019


Ответы (1)


Просто используйте специальный язык XSLT, предназначенный для преобразования файлов XML в необходимое выражение XPath. В частности, вызовите преобразование удостоверений, чтобы скопировать весь документ как есть и удалить все остальные узлы, которые не соответствуют критериям пустого шаблона.

Почти все современные языки программирования (Java, C#, Python, PHP, Perl, R, VB, даже Bash и PowerShell) и некоторые программы (Excel, SAS и т. д.) поддерживают XSLT 1.0, как правило, через XML-библиотеку или модуль. Кроме того, выделенные процессоры могут запускать ваш сценарий XSLT, включая Saxon, Xalan, xsltproc. Дополнительную информацию см. на странице тегов.

XSLT (сохранить как файл .xsl, специальный файл .xml)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <!-- REMOVE NODES -->
  <xsl:template match="o[normalize-space(cat) != 'category2']"/>

</xsl:stylesheet>

Онлайн-демонстрация


Несколько примеров процессора XSLT:

Командная строка Xalan (с компилятором Java)

java org.apache.xalan.xslt.Process -IN source.xml -XSL script.xsl -OUT output.xml

командные строки Saxon (с компилятором Java)< /эм>

java net.sf.saxon.Transform -s:source.xml -xsl:script.xsl -o:output.xml

java -jar dir/saxon9he.jar -s:source.xml -xsl:script.xsl -o:output.xml

xsltproc командная строка (для машин Unix)

xsltproc myScript.xsl Output.xml > myDesiredResult.xml

Сценарий Powershell (для компьютеров Windows)

$xslt = New-Object System.Xml.Xsl.XslCompiledTransform;

$xslt.Load("C:\Path\To\Script.xsl");
$xslt.Transform("C:\Path\To\Input.xml", "C:\Path\To\Output.xml");
person Parfait    schedule 26.09.2019
comment
Это оно! Большое спасибо! Есть ли возможность отправить файл на ftp-сервер с помощью PowerShell? У меня машина с Windows работает 24/7. - person Fenixq; 27.09.2019
comment
Рад помочь! Это звучит как новый вопрос, но определенно поищите в Интернете такое решение. - person Parfait; 27.09.2019