xmllint를 사용하여 XML을 구문 분석하고 출력을 사용자 정의

xmllint를 사용하여 XML을 구문 분석하고 출력을 사용자 정의

다음 스키마가 포함된 xml 파일(예: input.xml)이 있습니다.

<?xml version="1.0"?>
  <TagA>
    <TagB>
      <File Folder="FOLDER1M\1" File="R1.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER1M\2" File="R2.txt" />
    </TagB>
    <TagB>
      <File Folder="FOLDER2M\1" File="R3.txt" />
    </TagB>
  </TagA>

이 파일을 구문 분석하고 출력을 다른 파일에 써야 합니다. 원하는 출력은 다음 형식이어야 합니다.

www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt

내가 지금까지 얻은 것은 다음과 같습니다

echo 'cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]' | xmllint --shell input.xml | grep '=' > xml_parsed

이것은 나에게 다음과 같은 형식의 o/p를 제공합니다.

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"

현재 출력 대신 원하는 출력을 얻으려면 어떻게 해야 합니까?

답변1

이것은 한 가지 방법입니다. 더 쉽게 테스트할 수 있도록 출력을 example.txt라는 파일에 넣었습니다. echo 명령 끝에 내 명령을 추가하면 됩니다.

샘플.txt

Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"

주문하다

% cat sample.txt | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'

명령 분해

2줄씩 모두 합치기

# sed 'h;s/.*//;G;N;s/\n//g'
Folder="FOLDER1M\1"File="R1.txt"
Folder="FOLDER1M\2"File="R2.txt"
Folder="FOLDER2M\3"File="R3.txt"

폴더 삭제 = & "

# sed 's/Folder=\|"//g'
FOLDER1M\1File=R1.txt
FOLDER1M\2File=R2.txt
FOLDER2M\3File=R3.txt

File=을 '\'로 바꾸세요.

# sed 's/File=/\\/'
FOLDER1M\1\R1.txt
FOLDER1M\2\R2.txt
FOLDER2M\3\R3.txt

www.xyz.com을 삽입하세요.

# sed 's/^/www.xyz.com\\/'
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\3\R3.txt

편집 #1

OP는 출력의 첫 번째 줄을 제거하기 위해 내 답변을 수정하는 방법을 묻는 질문을 업데이트했습니다. 예를 들면 다음과 같습니다.

/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
...
...

나는 이것을 사용하여 grep -v ...다음과 같이 관련 없는 행을 필터링할 수 있다고 그에게 말했습니다.

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'

또는 전체 비트를 파일에 쓰려면 다음과 같이 수행할 수 있습니다.

% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/' > /path/to/some/file.txt

답변2

xmllint이를 위해 사용하는 것은 어려울 것입니다.

사용 xmlstarlet:

xmlstarlet sel -t \
    -m '//TagB/File' \
    -v 'concat("www.xyz.com", "\", @Folder, "\", @File)' \
    -nl file.xml

또는 명령줄에 웹사이트 주소를 안전하게 제공하려면,

thesite=www.xyz.com
xmlstarlet sel -t --var site="'$thesite'" \
    -m '//TagB/File' \
    -v 'concat($site, "\", @Folder, "\", @File)' \
    -nl file.xml

TagB/File먼저 문서의 모든 노드 집합을 선택한 다음 각 노드에 대해 문자열을 www.xyz.com속성 값 Folder및 속성 값 File( \사이에 구분 기호 포함)과 연결합니다. 이로 인해 -nl연결된 값 뒤에 개행 문자가 표시됩니다.

문제의 XML 문서의 출력을 제공합니다.

www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt

관련 정보