Удалить раздел XML из файла на Mac - PullRequest
1 голос
/ 17 апреля 2019

У меня есть файл XML с нижеприведенной структурой на Mac

<?xml version="1.0" encoding="UTF-8"?>
<Profile xmlns="http://test.com/data">
    <userPermissions>
        <enabled>true</enabled>
        <name>View</name>
    </userPermissions>
    <userPermissions>
        <enabled>true</enabled>
        <name>Edit</name>
    </userPermissions>  
    <userPermissions>
        <enabled>true</enabled>
        <name>Delete</name>
    </userPermissions>  
</Profile>

Я бы хотел иметь скрипт bash / cli для удаления из него раздела ниже.

<userPermissions>
    <enabled>true</enabled>
    <name>Delete</name>
</userPermissions>  

Как я могу сделать это с помощью sed / awk / xmlstarlet?

Я попробовал ниже. Не получайте ошибку, но это не делает работу также.

sed -i '' 's#</userPermissions><userPermissions><enabled>true</enabled><name>Delete</name></userPermissions>#</userPermissions>#' FileName.Profile

sed -i '' 's/<\/userPermissions><userPermissions><enabled>true<\/enabled><name>Delete<\/name><\/userPermissions>/<\/userPermissions>/' FileName.Profile

попробовал ниже и с XMLSTARLET, но не повезло

XMLStarlet ed --ps -d "/Profile/userPermissions[name='Delete'] FileName.profile"

1 Ответ

1 голос
/ 13 мая 2019

Используя XMLStarlet , вы можете выполнить следующую команду:

xml ed -L -N d="http://test.com/data" -d "d:Profile/d:userPermissions[child::d:name[.='Delete']]" FileName.profile

Примечание: Вам может необходимо заменить начальную xml часть команды выше на xmlstarlet

Пояснение:

  1. Ваш исходный xml включает Пространство имен (то есть объявление xmlns="http://test.com/data" в начальном теге элемента документа), поэтому вам нужно использовать опцию XMLStarlet -N, чтобы предопределить его при редактировании XML-документов с помощью команды ed.

    Как вы можете видеть в команде (выше) часть, которая читает;

    -N d="http://test.com/data"
    

    предопределяет пространство имен, используя имя d.

  2. Часть, которая гласит:

    "d:Profile/d:userPermissions[child::d:name[.='Delete']]"
    

    определяет выражение Xpath для адресации интересующей нас части (частей) XML-документа - в этом сценарии он обращается к элементу (ам), который мы хотим удалить.

    Как видите, каждая ссылка на узел элемента имеет префикс d:

    По сути, это xpath выражение; сопоставляет любые узлы элементов с именем userPermissions (принадлежащие пространству имен; http://test.com/data) только в том случае, если у них есть дочерний узел элемента с именем name, текстовый узел которого равен слову; "Delete".

  3. Параметр / флаг -d используется для удаления совпадений с выражением Xpath.

  4. Параметр / флаг -L редактирует файл на месте. Вы можете сначала удалить эту опцию / флаг для целей тестирования .

Результат

Если ваш исходный XML-код при выполнении команды (см. Выше), в файле с именем FileName.Profile будет получено следующее:

<?xml version="1.0" encoding="UTF-8"?>
<Profile xmlns="http://test.com/data">
  <userPermissions>
    <enabled>true</enabled>
    <name>View</name>
  </userPermissions>
  <userPermissions>
    <enabled>true</enabled>
    <name>Edit</name>
  </userPermissions>
</Profile>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...