Проверка нескольких объединенных XML в одном файле - PullRequest
0 голосов
/ 14 февраля 2020

Несколько XML файлов были объединены в один файл, см. Ниже демонстрационный пример. Как это можно проверить с помощью команды xmlstarlet или xmllint?

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookHeaderMsg xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
  <BookHdr>
     <tag>value</tag>
     <tag2>value</tag2>
  </BookHdr>
  <Payload>
     <payloadTag>value</payloadTag>
     <payloadTag2>value</payloadTag2>
  </Payload>
</BookHeaderMsg>

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
  <BookHdr>
     <tag>value</tag>
     <tag2>value</tag2>
  </BookHdr>
  <Payload>
     <payloadTag>value</payloadTag>
     <payloadTag2>value</payloadTag2>
  </Payload>
</BookTransfer>

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
  <BookHdr>
     <tag>value 1</tag>
     <tag2>value 2</tag2>
  </BookHdr>
  <Payload>
     <payloadTag>value 1</payloadTag>
     <payloadTag2>value 2</payloadTag2>
  </Payload>
</BookTransfer>

Я пытался xmlstarlet val Filename, а также xmllint --valid Filename оба возвращали неверно. Однако, если я разделю каждый XML на отдельные файлы, они будут действительны (к сожалению, это невозможно).

1 Ответ

0 голосов
/ 20 февраля 2020

Мне удалось проверить XML файлов, объединенных с несколькими другими XML документами, выполнив следующие действия:

  1. Создайте al oop для перебора файлов
  2. Использование Команда csplit для разделения XML документов из объединенного файла
  3. Проверка правильности разбивки XML документов из шага 2 с помощью команды xmlstarlet и перенаправление ее вывода в файл журнала
  4. Удалить разделение XML документов с шага 2 с использованием команды rm
  5. Повторите вышеуказанные процессы для других файлов

Сценарий:

#!/bin/bash

SOURCE_DIR="./src"
LOG_DIR="./log"


files=()
while IFS='' read -r -d ''
do
        files+=("$REPLY")
done < <(find "$SOURCE_DIR" -maxdepth 1 -type f -iname "*.xml" -printf '%p\0' | sort -zn)

total="${#files[@]}"
echo "start validating $total files" > "$LOG_DIR/summary.log"
counter=0
for file in "${files[@]}"
do
        ((counter++))
        # extract
        csplit "$file" --prefix="$file" --suffix-format='_%03d.xml.txt' --keep-files --elide-empty-files '/<?xml/' '{*}' &>/dev/null
        echo "$counter of $total working on $file"
        echo "$counter of $total working on $file" >> "$LOG_DIR/summary.log"
        # validate
        xmlstarlet val "$SOURCE_DIR"/*.xml.txt >> "$LOG_DIR/summary.log"

        # clean up
        rm "{$SOURCE_DIR}"/*.xml.txt
done
...