XML 태그 사이의 공백과 큰따옴표를 제거합니다.

XML 태그 사이의 공백과 큰따옴표를 제거합니다.

<ns:tag2>Linux의 XML 파일에 있는 XML 태그 값에서 공백과 따옴표를 제거하고 싶습니다 (이 태그에 대해서만 공백을 제거하고 다른 곳에서는 제거하지 않음).

XML 콘텐츠의 예는 다음과 같습니다.

<ns:tag1>
    <ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2> 
</ns:tag1>

하지만 아래와 같이 파일에 써야 합니다.

<ns:tag1>
    <ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2> 
</ns:tag1>

나는 다음에서 해결책을 보았습니다.XML 파일에서 공백과 따옴표가 포함된 문자열 제거sed 명령을 사용하여 따옴표를 제거하려고 시도했지만 성공하지 못했습니다.

sed  's/ ""//g'  temp.xml

올바른 구문을 제안해 주세요. 이 작업을 두 가지 다른 단계로 수행할 수 있다면 좋을 것입니다.

답변1

이것이 작업을 수행하는 XSLT 3.0 변환입니다.

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="ns:tag2/text()" xmlns:ns="xxxxx">
      <xsl:value-of select="translate(., '&quot; ', '')"/>        
  </xsl:template>
</xsl:template>

실제 네임스페이스 URI로 바꿉니다 xxxxx(예제에는 표시되지 않음).

어휘 수준에서 XML을 처리하기 위해 sed와 같은 비XML 인식 도구를 사용하지 마십시오. 잘못된 XML을 처리해야 하는 사람들로 인해 StackOverflow에서 수백 가지 문제가 발생하는 것을 볼 수 있으며 이러한 문제는 항상 이러한 유형의 접근 방식에서 발생합니다.

답변2

XML 파서를 사용하여 XML을 구문 분석할 수 있습니다. 나는 xmlstarlet나 자신을 좋아한다.

(어렴풋하게) 합리적인 네임스페이스 선언을 제공하기 위해 귀하의 예제를 수정했습니다 ns.

<ns:root xmlns:ns="localns">
  <ns:tag1>
    <ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
  </ns:tag1>
</ns:root>

이 시점에서 공백과 따옴표를 다음으로 바꿀 수 있습니다.아무것도 없다:

xmlstarlet edit -N ns=localns -u '//ns:tag2/text()' -x "translate(., ' \"', '')" xmlfile

결과

<?xml version="1.0"?>
<ns:root xmlns:ns="localns">
  <ns:tag1>
    <ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
  </ns:tag1>
</ns:root>

관련 정보