Natasha000
@Natasha000

Как разделить xml файл спомощью bat/cmd?

Помогите пожалуйста !
Необходимо разделить файл xml
<?xml version="1.0" encoding="UTF-8"?>
<post>
    <OrderReference>313</OrderReference>
    <OrderDate>2021-12-20 15:21:26</OrderDate>
    <ItemList>
      <ListLineItem>
        <OrderPosNumber>1</OrderPosNumber>
        <DistributorsArticleNo>100-027</DistributorsArticleNo>
        <OrderQuantity>3</OrderQuantity>
        <price>4,00</price>
      </ListLineItem>
      <ListLineItem>
        <OrderPosNumber>2</OrderPosNumber>
        <DistributorsArticleNo>100-015</DistributorsArticleNo>
        <OrderQuantity>2</OrderQuantity>
        <price>2,99</price>
      </ListLineItem>
    </ItemList>
</post>
<post>
    <OrderReference>315</OrderReference>
    <OrderDate>2021-12-25 15:21:26</OrderDate>
    <ItemList>
      <ListLineItem>
        <OrderPosNumber>1</OrderPosNumber>
        <DistributorsArticleNo>100-007</DistributorsArticleNo>
        <OrderQuantity>2</OrderQuantity>
        <price>6,00</price>
      </ListLineItem>
      <ListLineItem>
        <OrderPosNumber>2</OrderPosNumber>
        <DistributorsArticleNo>100-005</DistributorsArticleNo>
        <OrderQuantity>3</OrderQuantity>
        <price>1,99</price>
      </ListLineItem>
    </ItemList>
</post>


на файлы по тэгам post:

1.xml
<?xml version="1.0" encoding="UTF-8"?>
<post>
    <OrderReference>313</OrderReference>
    <OrderDate>2021-12-20 15:21:26</OrderDate>
    <ItemList>
      <ListLineItem>
        <OrderPosNumber>1</OrderPosNumber>
        <DistributorsArticleNo>100-027</DistributorsArticleNo>
        <OrderQuantity>3</OrderQuantity>
        <price>4,00</price>
      </ListLineItem>
      <ListLineItem>
        <OrderPosNumber>2</OrderPosNumber>
        <DistributorsArticleNo>100-015</DistributorsArticleNo>
        <OrderQuantity>2</OrderQuantity>
        <price>2,99</price>
      </ListLineItem>
    </ItemList>
</post>


2.xml
<?xml version="1.0" encoding="UTF-8"?>
<post>
    <OrderReference>315</OrderReference>
    <OrderDate>2021-12-25 15:21:26</OrderDate>
    <ItemList>
      <ListLineItem>
        <OrderPosNumber>1</OrderPosNumber>
        <DistributorsArticleNo>100-007</DistributorsArticleNo>
        <OrderQuantity>2</OrderQuantity>
        <price>6,00</price>
      </ListLineItem>
      <ListLineItem>
        <OrderPosNumber>2</OrderPosNumber>
        <DistributorsArticleNo>100-005</DistributorsArticleNo>
        <OrderQuantity>3</OrderQuantity>
        <price>1,99</price>
      </ListLineItem>
    </ItemList>
</post>


и т.д
Количество файлов равно количеству post

Если это невозможно в BAT/CMD , подскажите простую рабочую програмку для этого.
  • Вопрос задан
  • 676 просмотров
Пригласить эксперта
Ответы на вопрос 3
wisgest
@wisgest
Не ИТ-специалист
Если файл будет иметь именно такой вид, то это просто (при этом будут потеряны пустые строки, если они есть):
@echo off
setlocal enableextensions enabledelayedexpansion

:0
if "%~1" == "" (
	set /p in="Входной файл: "
	call :0 !in!
	exit /b
)

if not exist "%~1" (
	echo "%~f1" не найден.
	endlocal
	exit /b 1
)

set /a i = 0
for /f "usebackq skip=1 delims=" %%L in ("%~1") do  (
	if "%%L" == "<post>"  (
		set /a i += 1
		(echo ^<?xml version="1.0" encoding="UTF-8"?^>)>!i!.xml
	)
	(echo(%%L)>>!i!.xml
)
endlocal

— XML-формат не учитывается, идёт разделение по строкам <post>, которые должны начинаться с начала строки и не иметь пробелов в конце строки.
Ответ написан
@res2001
Developer, ex-admin
В батниках не реально обрабатывать xml, т.к. символы тегов, являются служебными для cmd, как только такая строка попадет в командную строку в батнике будет ошибка.
Так что этот вариант сразу отбросьте.

В винде есть и другие скриптовые языки из коробки, например power shell или jscript, используйте один из них.
На jscript помимо того, что можно просто обработать xml, как текстовый файл, можно использовать и xml парсер со всеми плюшками. На счет power shell я не в курсе, возможно то же есть что-то подобное.
Раз у вас wordpress используется, значит уже установлен PHP, можете его использовать.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Если под рукой есть баш, или стоит git-bash в системе, то можно следующим скриптом для баш.

NL="
"
while read; do
  if [ "$REPLY" == "<post>" ]; then
    BLOCK='<?xml version="1.0" encoding="UTF-8"?>'
  elif [[ "${REPLY}" =~ OrderReference ]]; then
    order="${REPLY#*Reference>}"
    order="${order%</Order*}"
  fi
  BLOCK="${BLOCK}${NL}${REPLY}"

  if [ "$REPLY" == "</post>" ]; then
    echo "$BLOCK">$order.xml
    echo "Writing block to $order"
  fi
done<"${1}"


вызываем
bash myscript MYFILE.xml
получаем файлы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы