• Login
Community
  • Login

XML File - Create an element and get a value from existing attribute

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
10 Posts 3 Posters 1.3k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S
    Software Support
    last edited by Sep 14, 2022, 8:59 AM

    Hello everyone!!

    I have an xml file and I am trying to create a new element and copy a value of an existing attribute on that.
    So, I would like to:

    1. Create a new element <weight> (above Price).
    2. Put the value of the existing “weight” label as value on the new <weight> element.

    To be more specific I quote an example of what I need to do…

    -------BEFORE----------
    <product>
    <code>009-110360</code>
    <Name>Test Prodcut 1</Name>
    <description>Desc of Product 1</description>
    <price>200.00</price>
    <specs>
    <spec>
    <label>Color</label>
    <value>Blue</value>
    </spec>
    <spec>
    <label>Watt</label>
    <value>30</value>
    </spec>
    <spec>
    <label>Weight</label>
    <value>2</value>
    </spec>
    <spec>
    <label>Packet</label>
    <value>5</value>
    </spec>
    </specs>
    </product>

    -------AFTER----------
    <product>
    <code>009-110360</code>
    <Name>Test Prodcut 1</Name>
    <description>Desc of Product 1</description>
    <price>200.00</price>
    <Weight>2</Weight>
    <specs>
    <spec>
    <label>Color</label>
    <value>Blue</value>
    </spec>
    <spec>
    <label>Watt</label>
    <value>30</value>
    </spec>
    <spec>
    <label>Weight</label>
    <value>2</value>
    </spec>
    <spec>
    <label>Packet</label>
    <value>5</value>
    </spec>
    </specs>
    </product>

    after.png

    Thank you all in advance!
    Chris

    A 1 Reply Last reply Sep 14, 2022, 11:55 AM Reply Quote 0
    • A
      Alan Kilborn @Software Support
      last edited by Sep 14, 2022, 11:55 AM

      @Software-Support

      It would have been better if you had followed the advice HERE for posting your question, because that way your sample data would be more representative of your real data. I know that these are different things because you posted data AND a screenshot of that data as it appears to you in N++. I’m speaking specifically of all of the leading whitespace shown in the screenshot but not reflected in your sample data.

      S 1 Reply Last reply Sep 14, 2022, 12:18 PM Reply Quote 0
      • A
        Alan Kilborn
        last edited by Sep 14, 2022, 12:13 PM

        Even with your data represenation problems, I think something like this could work:

        Find: (?s-i)^(<product>.*?(\h+)<price>.*?</price>(\R))(.*?Weight.*?(\d+).*?</product>)
        Replace: ${1}${2}<Weight>${5}</Weight>${3}${4}
        Mode: Regular expression

        More info on regex is HERE.

        S 1 Reply Last reply Sep 14, 2022, 3:21 PM Reply Quote 1
        • S
          Software Support @Alan Kilborn
          last edited by Sep 14, 2022, 12:18 PM

          This post is deleted!
          1 Reply Last reply Reply Quote 0
          • S
            Software Support
            last edited by Sep 14, 2022, 12:21 PM

            I apologize for that. You’re right about my posting.

            Your solution solved my question!!!
            Thank you very very much!!!

            A 1 Reply Last reply Sep 14, 2022, 12:25 PM Reply Quote 0
            • G
              guy038
              last edited by guy038 Sep 15, 2022, 12:43 AM Sep 14, 2022, 12:24 PM

              Hello, @software-support, @alan-kilborn and All,

              Oh ! Alan beat me at it :-)

              Two possible solutions :

              • SEARCH (?s)<product>.+?</price>\R(?!\h*<Weight>)\K(?=(?:(?!</product>).)+?Weight.+?(\d+))

              • REPLACE <Weight>\1</Weight>\r\n   OR   <Weight>\1</Weight>\n if you use UNIX files

              • Check the Regular expression search mode

              • Click once on the Replace All button ( Do not use the Replace button !)

              OR

              • SEARCH (?s)(<product>.+?</price>\R)(?!\h*<Weight>)(?=(?:(?!</product>).)+?Weight.+?(\d+))

              • REPLACE \1<Weight>\2</Weight>\r\n   OR   \1<Weight>\2</Weight>\n if you use UNIX files

              • Check the Regular expression search mode

              • Click once on the Replace All button or several times on the Replace buton


              For instance, with the INPUT text :

              <product>
              <code>009-110360</code>
              <Name>Test Prodcut 1</Name>
              <description>Desc of Product 1</description>
              <price>200.00</price>
              <spec>
              <label>Color</label>
              <value>Blue</value>
              </spec>
              <spec>
              <label>Watt</label>
              <value>30</value>
              </spec>
              <spec>
              <label>Weight</label>
              <value>2</value>
              </spec>
              <spec>
              <label>Packet</label>
              <value>5</value>
              </spec>
              </specs>
              </product>
              <product>
              <code>009-110360</code>
              <Name>Test Prodcut 1</Name>
              <description>Desc of Product 1</description>
              <price>200.00</price>
              <spec>
              <label>Color</label>
              <value>Blue</value>
              </spec>
              <spec>
              <label>Watt</label>
              <value>30</value>
              </spec>
              <spec>
              <label>Weight</label>
              <value>279</value>
              </spec>
              <spec>
              <label>Packet</label>
              <value>5</value>
              </spec>
              </specs>
              </product>
              

              you’ll get the expected OUTPUT text :

              <product>
              <code>009-110360</code>
              <Name>Test Prodcut 1</Name>
              <description>Desc of Product 1</description>
              <price>200.00</price>
              <Weight>2</Weight>
              <spec>
              <label>Color</label>
              <value>Blue</value>
              </spec>
              <spec>
              <label>Watt</label>
              <value>30</value>
              </spec>
              <spec>
              <label>Weight</label>
              <value>2</value>
              </spec>
              <spec>
              <label>Packet</label>
              <value>5</value>
              </spec>
              </specs>
              </product>
              <product>
              <code>009-110360</code>
              <Name>Test Prodcut 1</Name>
              <description>Desc of Product 1</description>
              <price>200.00</price>
              <Weight>279</Weight>
              <spec>
              <label>Color</label>
              <value>Blue</value>
              </spec>
              <spec>
              <label>Watt</label>
              <value>30</value>
              </spec>
              <spec>
              <label>Weight</label>
              <value>279</value>
              </spec>
              <spec>
              <label>Packet</label>
              <value>5</value>
              </spec>
              </specs>
              </product>
              

              In addition, there’s a security as you cannot run the regex S/R twice in order to get the wrong OUTPUT :

              ...
              ...
              <description>Desc of Product 1</description>
              <price>200.00</price>
              <Weight>2</Weight>
              <Weight>2</Weight>
              <spec>
              ...
              ...
              

              Best Regards,

              guy038

              A 1 Reply Last reply Sep 14, 2022, 12:27 PM Reply Quote 1
              • A
                Alan Kilborn @Software Support
                last edited by Sep 14, 2022, 12:25 PM

                @Software-Support said in XML File - Create an element and get a value from existing attribute:

                Your solution solved my question!!!

                That’s good, but also, hopefully you decided to learn more about HOW the solution works, for the NEXT time you need such a thing.

                1 Reply Last reply Reply Quote 1
                • A
                  Alan Kilborn @guy038
                  last edited by Sep 14, 2022, 12:27 PM

                  @guy038 said:

                  Two possible solutions

                  Actually, there are MANY possible solutions, and some “protect” your data more than others by enforcing validation of conditions. It’s all about what you need in a given situation.

                  When we respond to help requests here, we typically provide exactly what is requested, which MAY not meet the true need.

                  1 Reply Last reply Reply Quote 2
                  • S
                    Software Support @Alan Kilborn
                    last edited by Sep 14, 2022, 3:21 PM

                    @Alan-Kilborn

                    Hello Alan.
                    As I mentioned before, your way worked perfect and it does what I wished!
                    But, as I can see, decimal numbers are rounded and they are appeared as integers.
                    For example: The value 2.92 will be appeared as 2, the value 3.1 as 3 etc…

                    How could it be fixed ?
                    Thanx in advance!!

                    A 1 Reply Last reply Sep 14, 2022, 3:35 PM Reply Quote 0
                    • A
                      Alan Kilborn @Software Support
                      last edited by Sep 14, 2022, 3:35 PM

                      @Software-Support said in XML File - Create an element and get a value from existing attribute:

                      The value 2.92 will be appeared as 2

                      Well, for exactly that situation, you’d want to change the \d+ appearing in the original Find expression to \d+\.\d+, I guess…

                      But this gets into a bigger topic of how to match floating point numbers as well as integers.

                      And that really isn’t a Notepad++ topic, so patience with such questions wears thin. Suggest you follow the link I provided before about regular expressions.

                      1 Reply Last reply Reply Quote 1
                      4 out of 10
                      • First post
                        4/10
                        Last post
                      The Community of users of the Notepad++ text editor.
                      Powered by NodeBB | Contributors