XML komut satırı (kabuk komut dosyası) işleme


9

XML, kabuk betiğindeki komut satırından nasıl değiştirilir?

Sekmeli verileri işlemek, ortam değişkenini değiştirmek veya metin parçalarını normal ifadeyle değiştirmek için birçok komut var, ancak XML için hiçbir şey bulamadım.

Yapım komut dosyamın xml belgesinin ana etiketi içinde içeriğe sahip bir etiket eklemesi gerekiyor ve bu amaçla OS'de java, perl veya python yüklemek için bir overkill buluyorum (komut dosyalarım gitlab'da docker görüntüleri ile yapılıyor, bu yüzden maven'de mevcut olan araçlarla işim: 3.5-jdk-8 görüntüsü bir rüya olurdu).

Ben sed ile XML manipüle etmek istemiyorum, benim yapı komut dosyasında işe yarayacaktır, çünkü bu kötü .

Örnek: Aşağıdaki xml var:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>  
  <!-- a lot of other tags-->
</project>  

Ve aşağıdaki bloğu eklemek istiyorum:

<distributionManagement>
    <repository>
        <id>private-releases</id>
        <url>https://my.private.server.com/nexus/repository/maven-releases/</url>
    </repository>
</distributionManagement>

proje etiketinin içinde (ve başlangıçta mı yoksa sonunda mı olacağı önemli değil).


xml ve beklenen çıktıyı gönder
RomanPerekhrest

Yani belirli gereksinimler, herhangi bir büyük komut dosyası dillerinde uygulanmayan komut satırından çağrılabilen bir XML ayrıştırıcısı için değil, bağımsız bir C veya C ++ (veya başka bir derlenmiş) yardımcı program için mi?
Kusalananda

@Kusalanda Docker kapları içinde komut dosyaları çalıştırdığımı belirttim, bu yüzden docker görüntüsüne olabildiğince az eklemem çok önemli.
9ilsdx 9rvj 0lo

Eğer maven ve jdk ile bir görüntü varsa o zaman Java benim için en iyi seçenek gibi geliyor .... neden bu durumda Java ağır sence düşünüyorsun?
Daniel Pryden

Muhtemelen Stack Overflow ile ilgili bu soruyu sormak ve etiketlemek önemlidir maven- Maven'in içinde yapmaya çalıştığınız şeyi yapmanın daha iyi bir yolu olduğundan şüpheleniyorum.
Daniel Pryden

Yanıtlar:


10

XMLStarlet ( http://xmlstar.sourceforge.net/overview.php ) C ve kullanımları ile yazılmıştır libxml2ve libxslt.

XML belgesi verildi

<?xml version="1.0"?>
<root>
  <tag>data</tag>
</root>

rootkullanılarak eklenecek bir alt düğüm

xml ed -s '/root' -t elem -n 'newtag' -v 'newdata' file.xml

hangi üretir

<?xml version="1.0"?>
<root>
  <tag>data</tag>
  <newtag>newdata</newtag>
</root>

Birçok şey ekleme ( file.xmlüstteki orijinali kullanarak ):

xml ed -s '/root' -t elem -n 'newtag' \
       -s '/root/newtag' -t elem -n 'subtag' -v 'subdata' file.xml

Bu üretir

<?xml version="1.0"?>
<root>
  <tag>data</tag>
  <newtag>
    <subtag>subdata</subtag>
  </newtag>
</root>

Sorudaki örnek için:

xml ed -N x="http://maven.apache.org/POM/4.0.0" \
       -s '/x:project' -t elem -n 'distributionManagement' \
       -s '/x:project/distributionManagement' -t elem -n 'repository' \
       -s '/x:project/distributionManagement/repository' -t elem -n 'id' \
         -v 'private-releases' \
       -s '/x:project/distributionManagement/repository' -t elem -n 'url' \
         -v 'https://my.private.server.com/nexus/repository/maven-releases/' \
    file.xml

Sonuç:

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <!-- a lot of other tags-->
  <distributionManagement>
    <repository>
      <id>private-releases</id>
      <url>https://my.private.server.com/nexus/repository/maven-releases/</url>
    </repository>
  </distributionManagement>
</project>

Önceden hazırlanmış bir XML dosyasını XML'deki bir konuma ekleme:

Sorunun orijinal XML'inin bulunduğu file.xmlve yeni distributinManagementdüğümde gitmesi gereken ek bitlerin new.xml(ancak düğüm etiketinin kendisi değil) bulunduğu varsayılarak, kök düğüme eklemek için aşağıdakiler yapılabilirnew.xml :

xml ed -N x="http://maven.apache.org/POM/4.0.0" \
       -s '/x:project' -t elem -n 'distributionManagement' \
       -v "$(<new.xml)" file.xml | xml unesc | xml fo

XMLStarlet, <ve >karakterler gibi kaçması gereken verilerden otomatik olarak çıkacaktır . xml unescBit çıkış karakterini eklenen verileri (aslında ya bir sorun olabilir de olmayabilir de bütün belge, çıkış karakterini) ve xml foyeniden biçimlendirmeleri sonuç XML belgesi.

Sonuç

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <!-- a lot of other tags-->
  <distributionManagement>
    <repository>
      <id>private-releases</id>
      <url>https://my.private.server.com/nexus/repository/maven-releases/</url>
    </repository>
  </distributionManagement>
</project>

Bunu bu şekilde yapmaktan biraz tedirginim "ama işe yarıyor".

StackOverflow ile ilgili bu soruya da bakın: /programming/29298507/xmlstarlet-xinclude-xslt


Birden fazla etiket eklemek için sözdizimi oldukça uzun olmasına rağmen ilginç görünüyor. Sadece ubuntu'da buna 'xmlstarlet' denir. İçeriğin geçerli bir xml olduğu varsayılarak başka bir dosyanın içeriğini etiket olarak eklemek mümkün müdür?
9ilsdx 9rvj 0lo

@ 9ilsdx9rvj0lo Güncellenmiş cevaba bakın.
Kusalananda

"bu, bir sorun olabilecek veya olmayabilecek tüm belgenin çıkışını kaldırır". Evet büyük bir sorun, tüm mevcut & amp; kodlaması kaldırıldı, XML artık geçerli değil :(
rob

1

Bu amaçla OS'de java, perl veya python yüklemeyi çok fazla buluyorum (komut dosyalarım gitlab'da docker görüntüleri ile yapılıyor, bu yüzden işimi maven'de mevcut araçlarla yapmak: 3.5-jdk-8 görüntüsü bir rüya olurdu).

muhtemelen hala aşırı derecede dolu, ancak yalnızca kabın boyutuyla ilgileniyorsanız, Lua veya Guile gibi çok hafif bir dil kullanabilirsiniz.

Lua belgelerinden:

Bir uygulamaya Lua eklemek onu şişirmez. Kaynak kodu ve dokümantasyonu içeren Lua 5.3.4 için tarball, 297K sıkıştırılmış ve 1.1M sıkıştırılmamış olarak alır. Kaynak yaklaşık 24000 satır C içerir. 64 bit Linux altında, tüm standart Lua kitaplıklarıyla oluşturulan Lua yorumlayıcısı 246K alır ve Lua kitaplığı 421K alır.


Kapsayıcıya sadece LUA eklemeyi düşünmeye değer, bahşiş için teşekkürler.
9ilsdx 9rvj 0lo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.