2015-10-20 6 views
0

Я использовал stackoverflow в течение некоторого времени, но только сейчас зарегистрирован, чтобы задать вопрос.Переменные сценария Bash и xmllint - проверка на несколько xsd xml-файлов - используйте вывод для if

У меня есть несколько файлов xsd и xml-файлов, которые мне нужно проверить. Проверка отлично работает, когда я запускаю xmllint команду на отдельном файле:

xmllint --noout --schema Activity_date_1.xsd Activity_date_1.xml 

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

Я сделал это, но он не совсем делает то, что я хочу, если только это один файл.

xmllint --noout --schema Activity_*.xsd Activity_*.xml >/dev/null 2>&1 

xmllint --noout --schema Earning_*.xsd Earning_*.xml >/dev/null 2>&1 
xmllint --noout --schema Rules_*.xsd Rules_*.xml >/dev/null 2>&1 


OP=$? 

if [ $OP -eq 0 ] 
then 
    echo -e "\e[0;32;40mPassed Validation \e[0m" 
else 
    echo -e "\e[0;31;40mFailed Validation \e[0m" 
fi 

Я бы очень признателен за любую помощь.

+0

У вас действительно есть xsd-файлы для каждого xml-файла? Вы не хотите проверять все xmls на тот же файл xsd? –

+0

не могли бы вы разместить «ls» в каталоге с файлами? –

+0

Да, есть действительно отдельные файлы xsd для каждого xml-файла. Я не разработчик, поэтому я не уверен, почему или нет, но разработчики делают проверку вручную один за другим, поэтому я создаю скрипт, поэтому он проверяет весь файл один за другим. – spiceitup

ответ

0

Мне это удалось:

ниже код:

declare -a actdate 

actdate=($(ls xml-folder\Activity_*.xml | awk -F'Activity_' '{print $2}')) 

for date in ${actdate[*]} 
do 
xmllint --noout --schema xsd-folder/Activity.xsd xml-folder/Activity_$date 
done 

Это был год, и мои навыки Баш улучшились. Ниже приведена лучшая версия.

#!/bin/bash 
#find xsd files and strip the prefix (xsd/) <-- this is because my xsds are under xsds directory 
xsds=$(find xsds/ -name "*.xsd" | sed 's/xsds\///g') 
for f in $xsds 
do 
#Stripping suffix .xsd extension 
    xsd_file=$(echo $f | sed 's/.xsd/_/g') 
#finding all xml files 
    xmls=$(find . -name "$xsd_file*.xml") 
    for xf in $xmls 
    do 
#running xmllint on all 
     xmllint --noout --schema xsds/$f $xf 
    done 
done 
0

Вы пытаетесь передать все файлы в команду xmllint, Тогда как вы хотите, чтобы цикл по файлам и передать переменный цикл в команду по одному:

Предполагая, что дата является общим для {активность, заработав, правила} файлы:

for d in 19_09_2015 20_09_2015 <your dates here>; do 
    xmllint --noout --schema Activity_$d.xsd Activity_$d.xml >/dev/null 2>&1 
    xmllint --noout --schema Earning_$d.xsd Earning_$d.xml >/dev/null 2>&1 
    xmllint --noout --schema Rules_$d.xsd Rules_$d.xml >/dev/null 2>&1 

    OP=$? 

    if [ $OP -eq 0 ] 
    then 
     echo -e "\e[0;32;40m$d Passed Validation \e[0m" 
    else 
     echo -e "\e[0;31;40m$d Failed Validation \e[0m" 
    fi 
done 

Еще одна проблемы с вашим кодом является то, что ток только считает выход пыления на Rules файлов для рассмотрения, прошла ли проверка или нет. Чтобы исправить это - сделать что-то вроде следующего

for d in 19_09_2015 20_09_2015 <your dates here>; do 
    OP=0 
    xmllint --noout --schema Activity_$d.xsd Activity_$d.xml >/dev/null 2>&1 || OP=?! 
    xmllint --noout --schema Earning_$d.xsd Earning_$d.xml >/dev/null 2>&1 || OP=?! 
    xmllint --noout --schema Rules_$d.xsd Rules_$d.xml >/dev/null 2>&1 || OP=?! 

    if [ $OP -eq 0 ] 
    then 
     echo -e "\e[0;32;40m$d Passed Validation \e[0m" 
    else 
     echo -e "\e[0;31;40m$d Failed Validation \e[0m" 
    fi 
done 
+0

Спасибо, cmh, я пробовал его с двумя файлами, но эхо-подтверждение только одно. могу ли я сделать это индивидуально? также, что, если даты разные? – spiceitup

+0

Вы изменили '19_09_2015 20_09_2015 <ваши даты здесь>', чтобы быть разделенным пробелом списком ваших дат? – cmh

+0

Да, у меня есть. для d в «2015_10_14 2015_10_15»; do OP = 0 xmllint --noout --schema Activity.xsd Activit_ $ d.xml>/dev/null 2> & 1 || OP = ?! xmllint --noout --schema Award.xsd AwardRules_ $ d.xml>/dev/null 2> & 1 || OP = ?! – spiceitup

0

Для отчетности,

рассматривать как:

Используйте, если для каждого файла:

if xmllint ...; then 
    echo success 
    else 
    echo fail 
    fi 

или рассмотреть возможность использования Баш в «набор -e ". Установка «-e» вариант (см http://ss64.com/bash/set.html) с созданием ловушки может нравится:

trap '{ echo "validation failed"; }' ERR 
set -e 
for ...; do 
    xmllint ... 
done 

Когда Баш видит, что одна команда не удалось, он будет вызывать ERR ловушку и остановить программу.

Другой вариант заключается в создании функции, которая делает сложная часть:

validate_and_print_info() { 
    if "@" >/dev/null 2>&1; then 
    echo "successful" 
    else 
    echo "failed" 
    # exit 1 
    endif 
} 

и в вашей программе, используйте его как этот:

validate_and_print_info xmllint --noout --schema Rules_*.xsd Rules_*.xml 

Для итерации по всем файлам, это может (если я правильно понимаю ваши требования):

for xml_file in Activity_*.xml Earning_*.xml Rules_*.xml; do 
    xsd_file=${xml_file%.xml}.xsd 
    validate_and_print_info xmllint --noout --schema $xsd_file $xml_file 
done 

 Смежные вопросы

  • Нет связанных вопросов^_^