Добавить новую строку в XML-файл с терминалом оболочки - PullRequest
0 голосов
/ 12 октября 2018

У меня есть эта часть XML-файла:

  <xs:complexType name="NioLocationRequest">
    <xs:complexContent>
      <xs:extension base="tns:NioRequestBase">
        <xs:sequence>
          <xs:element name="forceCreation" type="xs:boolean"/>
          <xs:element name="location" type="ns1:Location"/>
          <xs:element minOccurs="0" name="roomZero" type="ns1:Room"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

, и я хочу вставить 'xs: element' между "location" и "roomZero" с терминалом оболочки (потому что изменение будет сделано вмного файлов).

Итак, я хотел бы, чтобы результат был таким:

  <xs:complexType name="NioLocationRequest">
    <xs:complexContent>
      <xs:extension base="tns:NioRequestBase">
        <xs:sequence>
          <xs:element name="forceCreation" type="xs:boolean"/>
          <xs:element name="location" type="ns1:Location"/>
          <xs:element name="replyTo" type="xs:string"/>
          <xs:element minOccurs="0" name="roomZero" type="ns1:Room"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

Кто-то может ответить, пожалуйста?Заранее спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

Используя xsh , вы можете написать

open file.xml ;
register-namespace xs http://www.w3.org/2001/XMLSchema ;
for //xs:sequence {
    my $elem := insert element xs:element after xs:element[@name="location"] ;
    set $elem/@name "replyTo" ;
    set $elem/@type "xs:string" ;
    insert text {"\n        "} before $elem ;
}
save :b ;

Чтобы заставить его работать над несколькими файлами, вы можете добавить внешний цикл:

for $file in { glob "*.xml" } {
    open $file ;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...