속성별로 XML 요소를 정렬하는 방법은 무엇입니까?

속성별로 XML 요소를 정렬하는 방법은 무엇입니까?

이 XML을 정렬하는 방법은 무엇입니까?

  1. 알파벳순으로 첫 번째: modulebefore property.
  2. 그런 다음 속성 이름을 알파벳순으로 지정 <module name="ClassTypeParameterName"/>합니다 <module name="PackageName"/>.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
  <property name="severity" value="error"/>
  <property name="fileExtensions" value="java"/>
  <module name="NewlineAtEndOfFile"/>
  <module name="FileTabCharacter"/>
  <module name="TreeWalker">
    <module name="PackageName"/>
    <module name="ClassTypeParameterName"/>
    <module name="InterfaceTypeParameterName"/>
    <module name="MethodTypeParameterName"/>
    <module name="LambdaParameterName"/>
    <module name="PatternVariableName"/>
    <module name="RecordComponentName"/>
    <module name="RecordTypeParameterName"/>
    <module name="TypeName">
      <property name="format" value="^[A-Z][_a-zA-Z0-9]*$"/>
    </module>
    <module name="AvoidDoubleBraceInitialization"/>
    <module name="AvoidNoArgumentSuperConstructorCall"/>
    <module name="OneTopLevelClass"/>
    <module name="OuterTypeFilename"/>
  </module>
</module>

xq여기에 사용된 것을 사용하고 싶습니다 .UNIX에서 Bash 스크립트를 사용하여 XML 파일을 정렬하시나요?

답변1

아마도 다음과 같은 것을 원할 것입니다.

xq -x -S 'walk(if type == "array" then sort_by(."@name") else . end)' file

-S(또는 )을 사용하면 키가 키 앞에 오도록 --sort-keys이름을 기준으로 키(XML 태그)를 정렬합니다 .moduleproperty

그런 다음 각 배열에 적용되는 재귀 함수를 사용하여 walk()속성 값( 로 작성됨)을 기준으로 sort_by()각 배열의 요소를 정렬합니다 .name."@name"

walk()사용법은 다음과 거의 동일합니다.jq매뉴얼의 예.

그러면 다음과 같은 출력이 생성됩니다.

<module name="Checker">
  <module name="FileTabCharacter"></module>
  <module name="NewlineAtEndOfFile"></module>
  <module name="TreeWalker">
    <module name="AvoidDoubleBraceInitialization"></module>
    <module name="AvoidNoArgumentSuperConstructorCall"></module>
    <module name="ClassTypeParameterName"></module>
    <module name="InterfaceTypeParameterName"></module>
    <module name="LambdaParameterName"></module>
    <module name="MethodTypeParameterName"></module>
    <module name="OneTopLevelClass"></module>
    <module name="OuterTypeFilename"></module>
    <module name="PackageName"></module>
    <module name="PatternVariableName"></module>
    <module name="RecordComponentName"></module>
    <module name="RecordTypeParameterName"></module>
    <module name="TypeName">
      <property name="format" value="^[A-Z][_a-zA-Z0-9]*$"></property>
    </module>
  </module>
  <property name="fileExtensions" value="java"></property>
  <property name="severity" value="error"></property>
</module>

xq빈 노드에 대해서도 닫는 마커가 명시적으로 작성된다는 점에 유의하세요 . 문제를 해결하려면( <tag attr="..."></tag>로 변경 <tag attr="..."/>) 결과를 xmlstarlet fo또는 에 전달하세요 xmlstarlet format.


참고로 원본 XML 문서에서 정렬 없이 변환된 JSON 문서와 jq표현식이 적용된 JSON 문서는 다음과 같습니다.

{
   "module": {
      "@name": "Checker",
      "module": [
         { "@name": "NewlineAtEndOfFile" },
         { "@name": "FileTabCharacter" },
         {
            "@name": "TreeWalker",
            "module": [
               { "@name": "PackageName" },
               { "@name": "ClassTypeParameterName" },
               { "@name": "InterfaceTypeParameterName" },
               { "@name": "MethodTypeParameterName" },
               { "@name": "LambdaParameterName" },
               { "@name": "PatternVariableName" },
               { "@name": "RecordComponentName" },
               { "@name": "RecordTypeParameterName" },
               {
                  "@name": "TypeName",
                  "property": { "@name": "format", "@value": "^[A-Z][_a-zA-Z0-9]*$"
               },
               { "@name": "AvoidDoubleBraceInitialization" },
               { "@name": "AvoidNoArgumentSuperConstructorCall" },
               { "@name": "OneTopLevelClass" },
               { "@name": "OuterTypeFilename" }
            ]
         }
      ],
      "property": [
         { "@name": "severity", "@value": "error" },
         { "@name": "fileExtensions", "@value": "java" }
      ]
   }
}

답변2

나는 OP와 매우 유사한 문제에 직면했고(온라인 도구를 제외한 고객 데이터를 포함하는 xml에 문제가 추가됨) 먼저 xq이 스크립트를 시작점으로 사용하여 상당한 성공을 거두었습니다.https://unix.stackexchange.com/a/659245/367314.

vscode그러나 마침내 코드 블록을 정렬하고 깊이를 구성할 수 있는 멋진 플러그인을 찾았습니다 . 다른 사람에게 도움이 될까 해서 여기에 글을 올리겠다고 생각했어요.

https://marketplace.visualstudio.com/items?itemName=1nVitr0.blocksort

블록 정렬 플러그인 데모

파일의 특정 블록만 정렬하려는 경우 UI에서 해당 블록을 선택하고 관심 있는 블록만 정렬하거나 전체 문서를 스마트 정렬할 수 있습니다.

자동화하려는 경우 좋은 솔루션은 아니지만 일회성으로는 좋습니다.

관련 정보