xmlstarlet을 사용하여 XML 값 업데이트

xmlstarlet을 사용하여 XML 값 업데이트

config.xml 파일이 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" id="app" version="2.5" android-versionCode="20500"> 
<name>App title</name> 
<description>Dummy dummy text.</description> 
</widget>

요소의 값을 변경하고 싶습니다.

나는 다음을 시도했습니다 :

xmlstarlet edit -L -u "/_:widget/name" -v "NEW_NAME" config.xml

그리고

xmlstarlet edit -L -u "//name" -v "NEW_NAME" config.xml

그러나 "애플리케이션 제목" 값은 변경되지 않았습니다.

답변1

요소가 네임스페이스에 name있으므로 네임스페이스를 지정해야 합니다 .http://www.w3.org/ns/widgets

xmlstarlet edit -L -N w=http://www.w3.org/ns/widgets -u "//w:name" -v "NEW_NAME" config.xml

답변2

이 명령은 제대로 작동하지만 xml 파일의 모든 항목을 변경합니다. (이름이 있는 모든 필드)

동일한 이름의 필드가 여러 개 있는 경우 무엇을 입력해야 합니까? 나는 시도했다:

xml ed -L -N w=http://artifactory.jfrog.org/xsd/1.7.9 -u "//w:mailServer/port" -v "123" artifactory.config.import.xml

그러나 아무 일도 일어나지 않았습니다. 그러나 주문이 수락되었습니다.

내가 사용할 때

xml ed -L -N w=http://artifactory.jfrog.org/xsd/1.7.9 -u "//w:port" -v "999" artifactory.config.import.xml 

이름 포트가 있는 각 항목은 값 999로 변경됩니다.

답변3

perl옵션 인가요 ? 그렇다면 저는 이것을 추천합니다. 이 훌륭한 XML::Twig라이브러리는 대부분의 XML 구문 분석 문제를 쉽게 해결할 수 있습니다. 내부 편집 포함:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig; 

sub set_name {
    my ( $twig, $element ) = @_;
    $element -> set_text ('A NEW NAME'); 
    $twig -> flush;
}

my $twig = XML::Twig -> new ( pretty_print => 'indented', twig_handlers => { 'name' => \&set_name } );
$twig -> parsefile_inplace('config.xml');

(명령줄에서 를 사용하여 파일 이름을 제공할 수 있습니다 $ARGV[0])

관련 정보