Как заставить xmllint возвращать только атрибут XML-элемента? - PullRequest
0 голосов
/ 20 сентября 2019
<Hosts>
    <Host Host_FQDN="myhost00.com">
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <Host_Directory_To_Clean Perform="text">
            <Perform_Deletes>true</Perform_Deletes>
            <Delete_Files_AbsolutePath>String</Delete_Files_AbsolutePath>
            <Delete_Files_Recursively>true</Delete_Files_Recursively>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
        </Host_Directory_To_Clean>
        <Host_FileSystem_Backup Perform="text">
            <Perform_Backup>False</Perform_Backup>
            <Backup_Full_Path>String</Backup_Full_Path>
            <Backup_File_Name>String</Backup_File_Name>
        </Host_FileSystem_Backup>
    </Host>
</Hosts>
<Hosts>
    <Host Host_FQDN=" myhost01.com">
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <Host_Directory_To_Clean Perform="text">
            <Perform_Deletes>true</Perform_Deletes>
            <Delete_Files_AbsolutePath>String</Delete_Files_AbsolutePath>
            <Delete_Files_Recursively>true</Delete_Files_Recursively>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
        </Host_Directory_To_Clean>
        <Host_FileSystem_Backup Perform="text">
            <Perform_Backup>N</Perform_Backup>
            <Backup_Full_Path>String</Backup_Full_Path>
            <Backup_File_Name>String</Backup_File_Name>
        </Host_FileSystem_Backup>
    </Host>
</Hosts>
<Hosts>
    <Host Host_FQDN=" myhost02.com">
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <ip_Address>text</ip_Address>
        <Host_Directory_To_Clean Perform="text">
            <Perform_Deletes>true</Perform_Deletes>
            <Delete_Files_AbsolutePath>String</Delete_Files_AbsolutePath>
            <Delete_Files_Recursively>true</Delete_Files_Recursively>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
            <Delete_Files_Selection>String</Delete_Files_Selection>
        </Host_Directory_To_Clean>
        <Host_FileSystem_Backup Perform="text">
            <Perform_Backup>NO</Perform_Backup>
            <Backup_Full_Path>String</Backup_Full_Path>
            <Backup_File_Name>String</Backup_File_Name>
        </Host_FileSystem_Backup>
    </Host>
</Hosts>

Я пытаюсь получить выражение xmllint –xpath, которое возвращает только значение элемента XML.Я пытался ...

xmllint --xpath string(//Hosts/Host)[1]/@Host_FQDN /myFile.xml
xmllint --xpath “string(//Hosts/Host)[1]/@Host_FQDN” /myFile.xml
xmllint --xpath (string(//Hosts/Host)[1]/@Host_FQDN) /myFile.xml
xmllint --xpath “(string(//Hosts/Host)[1]/@Host_FQDN)” /myFile.xml

Но результатом является одна или несколько из следующих ошибок.
bash: синтаксическая ошибка рядом с неожиданным токеном `('
Ошибка XPath: недопустимый тип
Ошибка оценки XPath

Если используется следующее, имя атрибута элемента XML и значение возвращаются. Я просто хочу значение.

xmllint --xpath (//Hosts/Host)[1]/@Host_FQDN /myFile.xml

Результаты ниже имеют начальный пробел.
Host_FQDN = "myhost.com"

Мне показалось странным, что функция count () работает отлично. См. Пример ниже.

xmllint --xpath count(//Hosts/Host)[1]/@Host_FQDN /myFile.xml

Ниже приведен фрагмент кода, который вызывает команду xmllint в скрипте BASH.

       unset wwString
       wwString="xmllint --xpath string(//"
       wwString="$wwString$xmlElementName)"
       wwString="$wwString["
       wwString="$wwString$i]/@"
       wwString="$wwString$xmlElementAttributeName "
       wwString="$wwString$propertiesFileFullPath"
       wwString="$wwString/"
       wwString="$wwString$fullXMLpropertiesFileName"
       wwExtracted=$(${wwString})

1 Ответ

1 голос
/ 20 сентября 2019

bash: синтаксическая ошибка рядом с неожиданным токеном `('

char ( распознается bash как токен bash, так что вам придется его избегать, но этоэто не то, что вам нужно. Вы хотите передать выражение XPath в xmllint, поэтому решение заключается в том, чтобы поместить выражение в скобки:

xmllint --xpath '//Hosts/Host[1]/@Host_FQDN' myFile.xml

Ваша вторая ошибка - interrupt string(...) функция в середине вашего выражения XPath. Таким образом, правильная версия ваших попыток будет выглядеть как

xmllint --xpath "string(//Hosts/Host[1]/@Host_FQDN)" myFile.xml

Вышеприведенное выражение возвращает только строковое значение первого Host элемента Host_FQDNатрибут.


Просто какая-то ужасная нота:
Вы использовали символ цитирования вместо " символ цитирования !!!
Это могло быть причиной ваших неисправностей.

...