Использование xmllint — трудности с получением атрибутов xml

mkdir split-files
find. -maxdepth 1 -type f -size +10000000c -exec split -b 10000000 {} split-files/{}. ';'

В текущем каталоге будут найдены файлы, размер которых превышает 10000000 байт (1000 КБ ). Он разделит эти файлы так, чтобы размер каждой части составлял 1000 КБ или меньше. Разделение происходит по границам байтов.

Разделенные файлы будут сохранены в новом каталоге split-filesи будут иметь то же имя, что и исходные файлы, с двухбуквенным суффиксом.

Исходные файлы остаются нетронутыми.

0
12.02.2020, 10:12
1 ответ

Вы нашли элемент, но вам нужно значение атрибута @DTS:ConnnectionString, а не значение самого элемента. Без пространств имен вы бы выбрали это с суффиксом @ConnectionString, но поскольку у вас здесь есть пространства имен, xmllintтребует, чтобы вы сопоставляли так же, как вы сопоставляли все имена ваших элементов, @*[local-name()='ConnectionString']. Кроме того, чтобы удалить имя атрибута из начала результата, вам нужно обработать все это с помощью string(). Уродливый.

xmllint --xpath "string(//*[local-name()='Executable']/*[local-name()='ConnectionManagers']/*[local-name()='ConnectionManager']/*[local-name()='ObjectData']/*[local-name()='ConnectionManager']/@*[local-name()='ConnectionString'])" file.xml

Выход

 Data Source=ADMIN-8DF005D47;Initial Catalog=AdventureWorks;Provider=SQLNCLI11;Integrated Security=SSPI;Application Name=SSIS-HardestNestedWorkflow2-{A32A68DF-3D53-4057-AF80-1B8D524F82BC}ADMIN-8DF005D47.AdventureWorks;Auto Translate=False;

Лично я предпочитаю xmlstarletдля такого рода операций, так как он более четко понимает пространства имен, но в конечном итоге лучше использовать наиболее удобный инструмент.

xmlstarlet sel xmlns:DTS="www.microsoft.com/SqlServer/Dts" -t -v '/DTS:Executable/DTS:Property' -n file.xml
8

xmlstarlet sel xmlns:DTS="www.microsoft.com/SqlServer/Dts" -t -v '/DTS:Executable//DTS:ConnectionManager/@DTS:ConnectionString' -n file.xml
Data Source=ADMIN-8DF005D47;Initial Catalog=AdventureWorks;Provider=SQLNCLI11;Integrated Security=SSPI;Application Name=SSIS-HardestNestedWorkflow2-{A32A68DF-3D53-4057-AF80-1B8D524F82BC}ADMIN-8DF005D47.AdventureWorks;Auto Translate=False;
0
28.04.2021, 23:23

Теги

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