How can i update the value of number in the xml?

Christian Kamp 20 Reputation points
2023-03-10T19:48:00.8766667+00:00

Hi there,

i've a xml file like follows and i want to change the values of the attribute of "number" in the right order (ascending) with powershell.

How can i do that? I can only set a static value to the attribute - but doing numbering in a loop will cause a error.

Thanks for help.

kikky

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<pages>
   <page name="20200820_RPOEDA" number="1" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RPO02" number="3" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RWF01" number="3" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RPO04" number="44" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RPO03" number="5" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RWI01" number="46" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RWI02" number="76" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RAW01" number="83" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RSP01" number="349" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RSP02" number="140" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RTS01" number="1531" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RSV01" number="132" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RKO01" number="1343" isTabloid="0" isPanorama="0"/>
   <page name="20200820_AED11" number="154" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED01" number="156" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED02" number="1656" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED03" number="157" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED04" number="18" isTabloid="0" isPanorama="0"/>
   <page name="20200820_AED05" number="19" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RKS1W" number="20" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RGV99" number="21" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RSAE99" number="22" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED06" number="23" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED07" number="24" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RSM01" number="25" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED08" number="26" isTabloid="0" isPanorama="0"/>
   <page name="20200820_RED09" number="27" isTabloid="0" isPanorama="0"/>
   <page name="20200820_AED10" number="28" isTabloid="0" isPanorama="0"/>
</pages>

Windows for business Windows Server User experience PowerShell
0 comments No comments
{count} votes

Accepted answer
  1. Rich Matheisen 47,901 Reputation points
    2023-03-11T02:53:03.59+00:00

    I'm assuming that you want to sort the "page" elements into ascending order based on the value of each elements' "number" attribute?

    This will do that and save the modified XML file at the end.

    $x = @'
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <pages>
       <page name="20200820_RPOEDA" number="1" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO02" number="3" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWF01" number="3" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO04" number="44" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO03" number="5" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWI01" number="46" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWI02" number="76" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RAW01" number="83" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSP01" number="349" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSP02" number="140" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RTS01" number="1531" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSV01" number="132" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RKO01" number="1343" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED11" number="154" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED01" number="156" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED02" number="1656" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED03" number="157" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED04" number="18" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED05" number="19" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RKS1W" number="20" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RGV99" number="21" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSAE99" number="22" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED06" number="23" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED07" number="24" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSM01" number="25" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED08" number="26" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED09" number="27" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED10" number="28" isTabloid="0" isPanorama="0"/>
    </pages>
    '@
    $xml = [xml]$x
    $SortedPageElements = $xml.pages.page | sort {[int]$_.number}
    $xml.pages.page |
        ForEach-Object{
        $_.ParentNode.RemoveChild($_) | Out-Null
    }
    $SortedPageElements |
        ForEach-Object{
            $xml.DocumentElement.AppendChild($_) | Out-Null
        }
    $xml.Save('c:\junk\new.xml')
    
    

    Note that the new file will have numeric values for the "number" attributes' value. The XML you posted has text values and if you sort those you won't have the sort turn out the way I think you want it to.

    0 comments No comments

2 additional answers

Sort by: Most helpful
  1. Christian Kamp 20 Reputation points
    2023-03-11T17:19:43.63+00:00

    Hey Rich, thank you for your help.

    I dont need to sort the elements. The only thing i've to do, is to make new numbers from 1 to x for the numbers-attribute.

    Greetings, kikky

    0 comments No comments

  2. Rich Matheisen 47,901 Reputation points
    2023-03-11T19:34:38.0666667+00:00

    Just updating the elements' "number" attribute is even easier!

    $x = @'
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <pages>
       <page name="20200820_RPOEDA" number="1" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO02" number="3" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWF01" number="3" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO04" number="44" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RPO03" number="5" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWI01" number="46" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RWI02" number="76" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RAW01" number="83" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSP01" number="349" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSP02" number="140" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RTS01" number="1531" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSV01" number="132" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RKO01" number="1343" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED11" number="154" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED01" number="156" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED02" number="1656" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED03" number="157" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED04" number="18" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED05" number="19" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RKS1W" number="20" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RGV99" number="21" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSAE99" number="22" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED06" number="23" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED07" number="24" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RSM01" number="25" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED08" number="26" isTabloid="0" isPanorama="0"/>
       <page name="20200820_RED09" number="27" isTabloid="0" isPanorama="0"/>
       <page name="20200820_AED10" number="28" isTabloid="0" isPanorama="0"/>
    </pages>
    '@
    $xml = [xml]$x
    
    $count = 1
    $xml.pages.page |
        ForEach-Object{
            $_.number = [string]($count++)
    }
    $xml.Save("C:\junk\new.xml")
    

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.