Проанализировать XML для получения значения узла в сценарии удара?

Общее решение протестировать память состоит в том, чтобы записать определенный шаблон как 0xFFFFFFFF к Вашей памяти и читают его впоследствии и сравнивают результат. Вы можете и должны, конечно, изменить шаблон для обнаружения проблем. Некоторые решения как memtest86+ также генерируйте случайные шаблоны и измените направление, которое они используют для записи в память. Поскольку более подробная информация об используемых алгоритмах в memtest86 взглянула на их техническую страницу. Все решения, предоставленные в этом сообщении, используют в основном ту же базовую идею.

Если Вы хотите запустить свой тест из Linux (Вы упомянули Linux в своем сообщении), взглянули на memtester и memtest комплект, который оба должны работать с рукой. Для начала работы необходимо использовать memtester, поскольку он в основном делает точно, что Вы хотите.

Тестирование Вашей памяти из Linux имеет некоторые недостатки как Вы, не может действительно протестировать всю Вашу физическую память, поскольку ядру также нужна память. Для тестирования памяти с uboot (это намного меньше, чем ядро Linux) взглянули на интегрированную команду mtest. Это позволяет Вам указывать диапазон адресов, шаблон и повторение. С mtest необходимо смочь сделать довольно обширное тестирование, не полагаясь на операционную систему. Просто необходимо удостовериться, что Вы используете допустимые диапазоны памяти иначе, может быть возможно, что Вы перезаписываете uboot регион памяти.

Если тестирование, обеспеченное mtest, недостаточно, можно, конечно, просто расширить uboot и интегрировать дополнительные функции тестирования памяти в uboot.

19
30.06.2016, 03:06
7 ответов

Используя bash и xmllint (как дано тегами):

xmllint --version  #  xmllint: using libxml version 20703

# Note: Newer versions of libxml / xmllint have a --xpath option which 
# makes it possible to use xpath expressions directly as arguments. 
# --xpath also enables precise output in contrast to the --shell & sed approaches below.
#xmllint --help 2>&1 | grep -i 'xpath'

{
# the given XML is in file.xml
host="$(echo "cat /config/global/resources/default_setup/connection/host/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
username="$(echo "cat /config/global/resources/default_setup/connection/username/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
password="$(echo "cat /config/global/resources/default_setup/connection/password/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
dbname="$(echo "cat /config/global/resources/default_setup/connection/dbname/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
printf '%s\n' "host: $host" "username: $username" "password: $password" "dbname: $dbname"
}

# output
# host: localhost
# username: root
# password: pass123
# dbname: testdb

В случае, если существует только строка XML, и использования временного файла нужно избежать, дескрипторы файлов являются способом пойти с xmllint (который дан /dev/fd/3 как аргумент файла здесь):

set +H
{
xmlstr='<?xml version="1.0"?>
<config>
    <global>
        <install>
            <date><![CDATA[Tue, 11 Dec 2012 12:31:25 +0000]]></date>
        </install>
        <crypt>
            <key><![CDATA[70e75d7969b900b696785f2f81ecb430]]></key>
        </crypt>
        <disable_local_modules>false</disable_local_modules>
        <resources>
            <db>
                <table_prefix><![CDATA[]]></table_prefix>
            </db>
            <default_setup>
                <connection>
                    <host><![CDATA[localhost]]></host>
                    <username><![CDATA[root]]></username>
                    <password><![CDATA[pass123]]></password>
                    <dbname><![CDATA[testdb]]></dbname>
                    <initStatements><![CDATA[SET NAMES utf8]]></initStatements>
                    <model><![CDATA[mysql4]]></model>
                    <type><![CDATA[pdo_mysql]]></type>
                    <pdoType><![CDATA[]]></pdoType>
                    <active>1</active>
                </connection>
            </default_setup>
        </resources>
        <session_save><![CDATA[files]]></session_save>
    </global>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <frontName><![CDATA[admin]]></frontName>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>
'

# exec issue
#exec 3<&- 3<<<"$xmlstr"
#exec 3<&- 3< <(printf '%s' "$xmlstr")
exec 3<&- 3<<EOF
$(printf '%s' "$xmlstr")
EOF

{ read -r host; read -r username; read -r password; read -r dbname; } < <(
       echo "cat /config/global/resources/default_setup/connection/*[self::host or self::username or self::password or self::dbname]/text()" | 
          xmllint --nocdata --shell /dev/fd/3 | 
          sed -e '1d;$d' -e '/^ *--* *$/d'
       )

printf '%s\n' "host: $host" "username: $username" "password: $password" "dbname: $dbname"

exec 3<&-
}
set -H


# output
# host: localhost
# username: root
# password: pass123
# dbname: testdb
19
27.01.2020, 19:45

Хотя уже существует много ответов, я соглашусь с xml2.

$ xml2 < test.xml
/config/global/install/date=Tue, 11 Dec 2012 12:31:25 +0000
/config/global/crypt/key=70e75d7969b900b696785f2f81ecb430
/config/global/disable_local_modules=false
/config/global/resources/db/table_prefix
/config/global/resources/default_setup/connection/host=localhost
/config/global/resources/default_setup/connection/username=root
/config/global/resources/default_setup/connection/password=pass123
/config/global/resources/default_setup/connection/dbname=testdb
/config/global/resources/default_setup/connection/initStatements=SET NAMES utf8
/config/global/resources/default_setup/connection/model=mysql4
/config/global/resources/default_setup/connection/type=pdo_mysql
/config/global/resources/default_setup/connection/pdoType
/config/global/resources/default_setup/connection/active=1
/config/global/session_save=files
/config/admin/routers/adminhtml/args/frontName=admin

С небольшим волшебством можно даже установить тех как переменные непосредственно:

$ eval $(xml2 < test.xml | tr '/, ' '___' | grep =)
$ echo $_config_global_resources_default_setup_connection_host          
localhost
6
27.01.2020, 19:45

Следующие работы, когда выполнено против Ваших данных тестирования:

{ read -r host; read -r username; read -r password; read -r dbname; } \
  < <(xmlstarlet sel -t -m /config/global/resources/default_setup/connection \
      -v ./host -n \
      -v ./username -n \
      -v ./password -n \
      -v ./dbname -n)

Это помещает содержание в переменные host, username, password и dbname.

3
27.01.2020, 19:45
  • 1
    xmlstarlet: команда не нашла, таким образом, эта команда не полезна для меня :( –  MagePsycho 17.07.2013, 18:31
  • 2
    @MagePsycho bash не имеет никакой встроенной поддержки парсинга XML. У Вас любой должен быть инструмент, который делает (xmlstarlet, xsltproc, современный Python, и т.д.), или Вы не можете проанализировать XML правильно. –  Charles Duffy 17.07.2013, 18:48
  • 3
    @CharlesDuffy является там способом добраться, значение может использовать regex шаблон или иначе? –  MagePsycho 17.07.2013, 18:51
  • 4
    @MagePsycho можно просто установить xmlstarlet. В любом случае Вы никогда не должны использовать регулярные выражения для парсинга (X) HTML. –  terdon♦ 17.07.2013, 18:57
  • 5
    @MagePsycho я собирался отправить ту же ссылку terdon уже, сделал. Короче говоря: Нет. –  Charles Duffy 17.07.2013, 19:05

Чистое bash функция, только для неудачного случая, когда Нельзя установить ничего соответствующего. Это, и вероятно будет, может перестать работать на более сложном XML:

function xmlpath()
{
  local expr="${1//\// }"
  local path=()
  local chunk tag data

  while IFS='' read -r -d '<' chunk; do
    IFS='>' read -r tag data <<< "$chunk"

    case "$tag" in
      '?'*) ;;
      '!–-'*) ;;
      '![CDATA['*) data="${tag:8:${#tag}-10}" ;;
      ?*'/') ;;
      '/'?*) unset path[${#path[@]}-1] ;;
      ?*) path+=("$tag") ;;
    esac

    [[ "${path[@]}" == "$expr" ]] && echo "$data"
  done
}

Использование:

bash-4.1$ xmlpath 'config/global/resources/default_setup/connection/host' < MagePsycho.xml
localhost

Известные проблемы:

  • медленный
  • поиски только именами тега
  • никакое декодирование символьной сущности
3
27.01.2020, 19:45

Можно использовать php кодирование интерфейса командной строки в сценариях удара для обработки нескольких сложных сценариев, которые на самом деле охватывают по нескольким строкам кодирования. Во-первых, попытайтесь сделать свое решение с помощью Сценариев PHP и затем позже передать параметры с помощью режима CLI. Таким образом можно получить контроль над превосходными использованиями синтаксических анализаторов XML.

Среда кажется, что можно использовать PHP в клиентском режиме через ssh/shell доступ.

php -f yourxmlparser.php

Теперь, сделайте все вещи в своем php файле. Используйте параметры командной строки, которые это может взять.

Можно даже присвоить, это возвращает значения к Среде оболочки для продолжения отдыха сценариев оболочки.

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

-1
27.01.2020, 19:45

Используя xmllint и опцию--xpath , это очень просто. Вы можете просто сделать это:

XML_FILE=/path/to/file.xml

HOST=$(xmllint --xpath 'string(/config/global/resources/default_setup/connection/host)' $XML_FILE
USERNAME=$(xmllint --xpath 'string(/config/global/resources/default_setup/connection/username)' $XML_FILE
PASSWORD=$(xmllint --xpath 'string(/config/global/resources/default_setup/connection/password)' $XML_FILE 
DBNAME=$(xmllint --xpath 'string(/config/global/resources/default_setup/connection/dbname)' $XML_FILE

Если вам нужно получить атрибут элемента, это также легко сделать с помощью XPath. Представьте, что у вас есть файл:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="screensaver.turnoff"
       name="Turn Off"
       version="0.10.0"
       provider-name="Dag Wieërs">
 ..snip..
</addon>

Необходимые операторы оболочки будут:

VERSION=$(xmllint --xpath 'string(/addon/@version)' $ADDON_XML)
AUTHOR=$(xmllint --xpath 'string(/addon/@provider-name)' $ADDON_XML)
7
27.01.2020, 19:45

В этом комментарии используются только команды и методы sh/bash! /test.xml — это ваш файл типа XML при первом вопросе...

#!/bin/sh

cat /test.xml | while read line;do
[ "$(echo "$line" | grep "<host>")" ]&& echo "host: $(echo $line |  cut -f3 -d'[' | cut -f1 -d']')"
[ "$(echo "$line" | grep "<username>")" ]&& echo "username: $(echo $line |  cut -f3 -d'[' | cut -f1 -d']')"
[ "$(echo "$line" | grep "<password>")" ]&& echo "password: $(echo $line |  cut -f3 -d'[' | cut -f1 -d']')"
[ "$(echo "$line" | grep "<dbname")" ]&& echo "dbname: $(echo $line |  cut -f3 -d'[' | cut -f1 -d']')"
done

выход:

host: localhost
username: root
password: pass123
dbname: testdb

Если вы хотите записать эти значения в файл, используйте этот метод:

#!/bin/sh

cat /test.xml | while read line;do
[ "$(echo "$line" | grep "<host>")" ]&& echo "$line" |  cut -f3 -d'[' | cut -f1 -d']' > /config/global/resources/default_setup/connection/host
[ "$(echo "$line" | grep "<username>")" ]&& echo "$line" |  cut -f3 -d'[' | cut -f1 -d']' > /config/global/resources/default_setup/connection/username
[ "$(echo "$line" | grep "<password>")" ]&& echo "$line" |  cut -f3 -d'[' | cut -f1 -d']' > /config/global/resources/default_setup/connection/password
[ "$(echo "$line" | grep "<dbname")" ]&& echo "$line" |  cut -f3 -d'[' | cut -f1 -d']' > /config/global/resources/default_setup/connection/dbname
done

этот метод перезапишет ваши локальные файлы, используемые только для получения значений (ваши данные будут потеряны из выходных файлов)

0
27.01.2020, 19:45

Теги

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