XMLstarlet не находит текст с "в нем - PullRequest
0 голосов
/ 21 сентября 2018

Я использую XMLstarlet через скрипт Bash для поиска изменений, выполненных в Git, и создания нового XML-файла, который содержит только измененные узлы.
Работает, как ожидалось, но мне не удается сопоставить объект, содержащий строку.".

XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
<labels>
        <fullName>Your_Previously_Selected_Rates_Not_Applicable</fullName>
        <categories>Error</categories>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Your Previously Selected Rates Not Applicable</shortDescription>
        <value>The rate previously selected isn&apos;t eligible. Please click on &quot;Select&quot; to select a new one.</value>
</labels>
</CustomLabels>

Ранее у нас были проблемы с &apos;, но мы исправили его, заменив в скрипте на 'вместо.Пытался сделать то же самое с &quot;, который будет заменен на ", но это путает команды в bash.Команда, которую мы выполняем:

xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" -t -c "//x:labels[x:value/text()=\"The rate previsouly selected isn't eligible. Please click on &quot;Select&quot; to select a new one.\"]/x:fullName" -n CustomLabels.labels

Любая подсказка, что мне нужно сделать, чтобы найти этот текст?

1 Ответ

0 голосов
/ 26 сентября 2018

Это грязно.

По сути, вы должны позаботиться о двух вещах.

  1. Цитировать Bash
  2. XPath не имеет формы экранирования кавычек.

Хитрость заключается в использовании конкатенации :

xmlstarlet sel -N x="http://soap.sforce.com/2006/04/metadata" \
   -t -c "//x:labels[x:value/text()=concat('The rate previously selected isn',\"'\",'t eligible. Please click on \"Select\" to select a new one.')]/x:fullName"

Правила:

  1. Использование двойногоцитаты, чтобы определить ваш XPath.Таким образом, вы по-прежнему можете избегать двойных кавычек и использовать одинарные кавычки для функции concat.

    ... -t -c "//x:lab...x:fullName"
    
  2. Избегать одинарных кавычек, которые у вас есть, из isn't путем ввода строкив вашей функции concat, которая написана с экранированными двойными кавычками.

    ...ted isn',\"'\",'t elig...
    
  3. Запишите все остальные записи concat в одинарные кавычки и удалите все двойные кавычки:

    ...,'t elig... on \"Select\" to ...
    
...