PowerShell을 사용하여 XML 문서 요소 정렬 및 삭제

SyncErr0r

드라이버 정보가 포함 된 XML 문서를 구성하려고합니다. 다음은 내가 작업중인 작업의 예입니다.

<?xml version="1.0" encoding="utf-8"?>
<IncludeFragment xmlns:p="http://schemas.microsoft.com/someschema">> 
  <FFUDriver>
    <Component>
      <Package>
        <p:PackageName>Intel.Display.Driver</PackageName>
        <p:PackageFeedName>Feed</PackageFeedName>
        <p:Version>10.24.0.1638</Version>
        <p:Flavor>release</Flavor>
      </Package>
    </Component>
  </FFUDriver>
  <FFUDriver>
    <Component>
      <Package>
        <p:PackageName>Intel.Audio.Driver</PackageName>
        <p:PackageFeedName>Feed</PackageFeedName>
        <p:Flavor>release</Flavor>
        <p:Version>10.24.0.1638</Version>
        <p:CabName>Intel.Audio.cab</CabName>
      </Package>
    </Component>
  </FFUDriver>
</IncludeFragment>

각 패키지의 요소를 다음 순서로 정렬해야합니다.

  1. 패키지 이름
  2. PackageFeedName
  3. 버전

내 예제 XML 코드에서와 같이 패키지의 일부 요소는 이미 적절한 순서로되어 있지만 일부는 그렇지 않습니다. 또한 각 패키지는 PackageName을 기준으로 알파벳 순서로 정렬해야합니다. 저는 PowerShell에서 XML로 작업하는 것이 처음이며이 작업을 수행하는 방법을 평생 알 수 없습니다.

다른 요구 사항은 모든 <CabName>요소 를 찾아 삭제하는 것 입니다. 나는 그것을 알아 냈다. 불행히도 아래에있는 코드는 자식 요소 <Package>중 하나가이면 요소의 모든 자식 요소를 삭제합니다 <CabName>. 만 선택하고 삭제하는 구문을 알아낼 수없는 것 같습니다 <CabName>.

$Path = 'C:\Drivers.xml'
$xml = New-Object -TypeName XML
$xml.Load($Path)

$xml.SelectNodes('//Package[CabName]') | ForEach-Object {
    $_.ParentNode.RemoveChild($_)
}

$xml.Save('C:\Test.xml')

업데이트 : Ansgar Wiechers의 도움으로 완성 된 코드는 다음과 같습니다. 작업하는 일부 문서에 네임 스페이스가 포함되어 있으므로 예제 XML 데이터를 업데이트하여 네임 스페이스를 포함했습니다. 아래 코드는 네임 스페이스를 처리합니다. 유사한 문제 / 질문이있는 다른 사람에게 도움이되기를 바랍니다.

[CmdletBinding()]
Param
(
    [Parameter(Mandatory = $True, Position = 0)]
    [ValidateScript({
        $_ = $_ -replace '"', ""
        if (-Not (Test-Path -Path $_ -PathType Leaf))
        {
            Throw "`n `n$_ `n `nThe specified file or path does not exist. Check the file name and path, and then try again."
        }
        return $True
    })]
    [System.String]$XMLPath,

    [Parameter(Mandatory = $False, Position = 1)]
    [System.String]$nsPrefix = "p",

    [Parameter(Mandatory = $False, Position = 2)]
    [System.String]$nsURI = "http://schemas.microsoft.com/someschema"
)


# Remove quotes from full path name, if they are present
$XMLPath = $XMLPath -replace '"', ""


$xml = New-Object -TypeName XML
$xml.Load($XMLPath)
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace($nsPrefix, $nsURI)


# Delete all CabName elements
$xml.SelectNodes('//p:CabName', $ns) | ForEach-Object {

    $_.ParentNode.RemoveChild($_) | Out-Null
}


# Sort each Package element's child nodes based on custom order
$SortList = 'p:PackageName', 'p:PackageFeedName', 'p:Version', 'p:Flavor'

$xml.SelectNodes('//Package') | ForEach-Object {

    $parent = $_

    $SortList | ForEach-Object {

        $child = $parent.RemoveChild($parent.SelectSingleNode("./$_", $ns))
        $parent.AppendChild($child)
    }
} | Out-Null


# Sort each Package element in alphabetical order based on its child node PackageName
$PackageNameList = $xml.SelectNodes('//p:PackageName', $ns) | Select-Object -Expand '#text' | Sort-Object

$xml.SelectNodes('//IncludeFragment') | ForEach-Object {

    $parent = $_

    $PackageNameList | ForEach-Object {

        $child = $parent.RemoveChild($parent.SelectSingleNode("./FFUDriver[Component/Package/p:PackageName/text()='$_']", $ns))
        $parent.AppendChild($child)
    }
} | Out-Null


$XMLPath = $XMLPath -replace ".xml", "_sorted.xml"

$xml.Save($XMLPath)

Write-Host "`nSorting complete. Sorted XML document saved under $XMLPath" -ForegroundColor Green
Ansgar Wiechers

보유한 코드는 <Package>해당 노드의 <CabName>모든 하위 요소뿐만 아니라 하위 요소가있는 모든 노드를 삭제합니다 . 이는 자식 노드 를 포함하는 //Package[CabName]모든 <Package>노드 와 일치 하기 때문 <CabName>입니다. 실제로 일치시키려는 <CabName>것은 <Package>부모 노드 가있는 모든 노드입니다 .

$xml.SelectNodes('./Package/CabName') | ForEach-Object {
    $_.ParentNode.RemoveChild($_) | Out-Null
}

또한 일반적으로 XML에서 요소의 순서는 중요하지 않으므로 요소를 정렬하는 것은 의미가 없습니다. 그러나 어떤 이유로 특정 순서로 자식 노드가 있어야하는 경우 원하는 순서로 제거하고 추가하여 요소를 정렬 할 수 있습니다.

# names of the child nodes in the desired order
$nodenames = 'PackageName', 'PackageFeedName', 'Version', 'Flavor'

$xml.SelectNodes('//Package') | ForEach-Object {
    $parent = $_

    $nodenames | ForEach-Object {
        $child = $parent.RemoveChild($parent.SelectSingleNode("./$_"))
        $parent.AppendChild($child)
    }
}

당신은 또한 원하는 경우 <Driver>노드는 패키지 이름으로 분류하면 패키지 이름의 정렬 된 목록을 구축하는 최초의 필요성 :

$xml.SelectNodes('//PackageName') | Select-Object -Expand '#text' | Sort-Object

그런 다음 위와 동일한 기술을 사용하여 <Driver>노드에서 노드 를 제거하고 추가 <Drivers>합니다. 이 경우 필터 패턴을 사용해야합니다.

"./Driver[Component/Package/PackageName/text()='$_']"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

VB.NET을 사용하여 XML 파일에서 특정 요소 삭제

C #의 LINQ를 사용하여 XML 문서의 요소 그룹화 및 정렬

속성을 사용하여 목록에서 요소 추가 및 삭제

정규식을 사용하여 문자열 열에서 소수 및 숫자가 아닌 삭제

std :: erase 및 std :: remove 조합을 사용하여 특정 요소를 삭제하면 특정 예제에서 작동하지 않습니다.

C #에서 특정 XML 요소 및 해당 자식 요소 삭제

DOMDocument를 사용하여 PHP에서 XML 요소 삭제

파이썬의 목록에서 정규식을 사용하여 요소 삭제

PowerShell을 사용하여 Excel에서 행 필터링 및 삭제

python 및 BeautifulSoup을 사용하여 xml에서 전체 요소를 제거하는 방법

<xsl : sort>를 사용하여 노드 값을 기준으로 XML을 정렬하고 요소 이름 문제를 변경합니다.

Etree를 사용하여 XML에서 특정 요소 제거

셸 명령을 사용하여 특정 XML 문서 요소를 다른 XML 문서로 복사

"symbol"및 "use"방법을 사용하여 svg 요소 정렬

요소에서 이전 항목 정렬을 해제하는 필터를 사용하여 배열 항목 정렬

Elasticsearch에서 정렬을 사용하여 쿼리로 삭제

구문을 사용하여 SPSS에서 행 및 열 삭제

Powershell을 사용하여 기존 XML 문서에 새 요소 만들기

지정된 평균 및 요소 당 분산을 사용하여 numpy에서 정규 분포 행렬 만들기

반응을 사용하여 목록에서 요소 삭제

XSLT를 사용하여 xml에서 uuid 정렬 문제

Dynamo에서 단일 UpdateExpression을 사용하여 설정 및 삭제하는 방법

HTML 및 CSS 요소 정렬 문제

Go에서 대체 콘텐츠 유형을 사용하여 XML 요소 비 정렬 화

jQuery : 정렬 가능을 사용하여 삭제 한 후 요소의 속성 값을 유지하는 방법

XPath를 사용하여 WIX에서 XmlConfig 확장이있는 XML 요소 삭제

xml 요소 이름에서 공백을 제거하고 하나를 유지하는 여러 요소 삭제

$ pull 및 $ cond 연산자를 사용하여 배열에서 요소 삭제

.sort () 및 .data ()를 사용하여 IE11 및 Edge에서 HTML 요소 정렬

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관