• Login
Community
  • Login

Generate loops in xml templats

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
8 Posts 2 Posters 1.7k 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.
  • P
    Per Elkjær Nielsen
    last edited by Mar 13, 2019, 8:34 AM

    Hi
    I want to make a loop in a given template, where I wich to insert a value in the same line, and it must be replaced with value from a txt or excel continuously

    I have not yet been able to find solution so therefore my question, and hope for some help to solve that issue

    Example
    I have an xml template which I’ve made several times via Macro, and I want to continuously replace [A] in this line <userId> [A] </userId> with a list in a txt or excel (A,B and C)

    <userId>[A]</userId>
    <criteriaName></criteriaName>
    <fromDnCriteria>
    <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
    <includeAnonymousCallers>false</includeAnonymousCallers>
    <includeUnavailableCallers>false</includeUnavailableCallers>

    	 <userId>[B]</userId> 
      <criteriaName></criteriaName> 
      <fromDnCriteria> 
         <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
         <includeAnonymousCallers>false</includeAnonymousCallers> 
         <includeUnavailableCallers>false</includeUnavailableCallers>
    	 
    	 <userId>[C]</userId> 
      <criteriaName></criteriaName> 
      <fromDnCriteria> 
         <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
         <includeAnonymousCallers>false</includeAnonymousCallers> 
         <includeUnavailableCallers>false</includeUnavailableCallers>
    

    Br
    Per Elkjær

    1 Reply Last reply Reply Quote 0
    • G
      guy038
      last edited by guy038 Nov 19, 2022, 10:11 PM Mar 13, 2019, 10:47 AM

      Hello, @per-elkjær-nielsen, and All,

      Not difficult with regular expressions, indeed !

      Let’s suppose that you have this list of user-id, below :

      569AB56AZ
      123CD12AY
      89CD1HJ
      9999AZ0000AR
      1AA52ZZ
      

      Just note that the lines, above, may contain any kind of user-id !

      Then :

      • Open a new N++ tab

      • Paste your complete list of user-id items

      • Add a separator line of, EXACTLY , 5 tildes

      • Now, add your xml template, WITHOUT the first line <userId>.....</userId>

      • Finally, add a last line-break, after the last line <includeUnavailableCallers>false</includeUnavailableCallers>

      So, refering to our example, we get the following text :

      569AB56AZ
      123CD12AY
      89CD1HJ
      9999AZ0000AR
      1AA52ZZ
      ~~~~~
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
      

      Then :

      • Open the Replace dialog ( Ctrl + H )

      • SEARCH (?-s)^(.+)(?s)(?=.+^~~~~~(\R.+))|^~~~~~.+

      • REPLACE ?1\x20\x20\x20\x20\x20<userId>\1</userId>\2

      • Check, preferably, the Wrap around option

      • Select the Regular expression search mode

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

      Et voilà !

      You text should have been changed into :

           <userId>569AB56AZ</userId>
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
           <userId>123CD12AY</userId>
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
           <userId>89CD1HJ</userId>
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
           <userId>9999AZ0000AR</userId>
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
           <userId>1AA52ZZ</userId>
        <criteriaName></criteriaName> 
        <fromDnCriteria> 
           <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection> 
           <includeAnonymousCallers>false</includeAnonymousCallers> 
           <includeUnavailableCallers>false</includeUnavailableCallers>
      
      

      Nice, isn’t it ?

      Remarks :

      • If the last line of your template, ending the current file, is not followed with a line-break, then, after replacement, the different blocks are joined and not separated with an empty line

      • I’ve respected the number of leadings spaces ( 5 ), of the line <userId>..........</userId>. If necessary, adjust the number of \x20, in the replacement part !

      Best Regards,

      guy038

      1 Reply Last reply Reply Quote 5
      • P
        Per Elkjær Nielsen
        last edited by Mar 13, 2019, 1:17 PM

        Great :-) that’s working as you said :-)

        If now <userId></userId> not is the first line,but the second line , what would then ?1\x20\x20\x20\x20\x20<userId>\1</userId>\2 be

        Forgive my questions, I’m not so familiar with regular expressions yet :-)

        Example:

        <fromDnCriteria>
        <userId></userId>
        <criteriaName></criteriaName>
        <fromDnCriteria>
        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
        <includeAnonymousCallers>false</includeAnonymousCallers>
        <includeUnavailableCallers>false</includeUnavailableCallers>

        Br Per

        1 Reply Last reply Reply Quote 1
        • G
          guy038
          last edited by guy038 Mar 13, 2019, 9:39 PM Mar 13, 2019, 9:39 PM

          Hi, @per-elkjær-nielsen,

          The possible lines, located before the <userId>..........</userId> part is not the problem. As usual, I only need to know the general layout of the text, on which the regex will act !

          Furthermore, in your last example, there are two lines <fromDnCriteria> One of the two shouldn’t it be </fromDnCriteria> ?

          Here are the way how I imagine your text, with, of course, the different user-id instead of the ■ characters :

          ...
          
          <fromDnCriteria>
          <userId>■</userId>
          <criteriaName></criteriaName>
          </fromDnCriteria>
          <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
          <includeAnonymousCallers>false</includeAnonymousCallers>
          <includeUnavailableCallers>false</includeUnavailableCallers>
          
          <fromDnCriteria>
          <userId>■</userId>
          <criteriaName></criteriaName>
          </fromDnCriteria>
          <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
          <includeAnonymousCallers>false</includeAnonymousCallers>
          <includeUnavailableCallers>false</includeUnavailableCallers>
          
          ....
          

          Just tell me if I’m right or wrong about it ! Remember that regexes are very sensitive to real text : a simple space char or an additional line-break can cause the regular expression to malfunction

          So, I would advice to put some part of XML code, as it is, without any additional indentation, between the following two lines :

          ~~~xml

          ~~~

          See you later,

          BR

          guy038

          1 Reply Last reply Reply Quote 2
          • P
            Per Elkjær Nielsen
            last edited by Mar 14, 2019, 2:36 PM

            Hi guy038

            The example should simply illustrate a given xml file where I want to change a value in a different line than the first line so that it is correctly illustrated

            My plan was to be able to find a regular expressions template which I just have to adjust depending on which line I want to insert a value with loop

            Example of real xml template I will typically work with:

            <?xml version=“1.0” encoding=“ISO-8859-1”?>
            <BroadsoftDocument protocol=“OCI” xmlns=“C”>
            <sessionId xmlns=“”></sessionId>
            <command xsi:type=“UserSelectiveCallRejectionAddCriteriaRequest16” xmlns=“” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance ”>
            <userId></userId>
            <criteriaName></criteriaName>
            <fromDnCriteria>
            <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
            <includeAnonymousCallers>false</includeAnonymousCallers>
            <includeUnavailableCallers>false</includeUnavailableCallers>
            <phoneNumber></phoneNumber>
            </fromDnCriteria>
            <blacklisted>false</blacklisted>
            </command>
            </BroadsoftDocument>

            And again <userId></userId> is my target

            Br Per

            1 Reply Last reply Reply Quote 0
            • G
              guy038
              last edited by guy038 Mar 15, 2019, 11:47 PM Mar 15, 2019, 4:18 PM

              Hi, @per-elkjær-nielsen and All,

              Last night, when I was thinking about your problem, I discovered a fairly simple way to fill up data, in some areas of an XML template, simultaneously, thanks to the use of native N++ features such as column editor, sorting and regular expressions !

              I was quite happy with my solution and eager to share it with you, but as it was getting late, I preferred to wait until the next day to reply you.

              Unfortunately, today, I don’t really have a heart to laugh about and I’m just sick and sad about what just happened in New Zealand:-((( We have already experienced such horrors in France. These terrorists, whatever their politic opinions, are an insult to human intelligence ! When will this murderous madness end ?

              Finally, when I see my pussy, coming and going over my keyboard, I just think she’s the most human of us ! But we will not abdicate and continue to enlighten consciences rather than compel them ! So, at my humble level, Per, I’m going to start by solving your problem ! The method is a bit long, but works nicely ;-))


              Let’s suppose we have this XML template, repeated 12 times, consecutively, in a new tab :

              <command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                  <userId></userId>
                  <criteriaName></criteriaName>
                  <fromDnCriteria>
                      <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
                      <includeAnonymousCallers>false</includeAnonymousCallers>
                      <includeUnavailableCallers>false</includeUnavailableCallers>
                      <phoneNumber></phoneNumber>
                  </fromDnCriteria>
                  <blacklisted>false</blacklisted>
              </command>
              <command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                  <userId></userId>
                  <criteriaName></criteriaName>
                  <fromDnCriteria>
                      <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
                      <includeAnonymousCallers>false</includeAnonymousCallers>
                      <includeUnavailableCallers>false</includeUnavailableCallers>
                      <phoneNumber></phoneNumber>
                  </fromDnCriteria>
                  <blacklisted>false</blacklisted>
              </command>
              <command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                  <userId></userId>
                  <criteriaName></criteriaName>
              ..............
              ..............
              

              Here, I 've just showed two identical templates, as a post cannot contain more than 16384 chars ! But just imagine there are 12, in totality !

              Now :

              • Move the cursor at the very beginning of text

              • Open the Column editor ( Alt + C or Editor > Column Editor... )

              • Select the option Number to Insert

              • Type 1 as Initial number

              • Type 1 as Increase by

              • Type 11 as Repeat ( Note that it’s the exact number of lines of the template ! )

              • Check the Leading zeros option ( IMPORTANT )

              • Verify that the Dec format is selected

              • Click on the OK button

              Once, you’ve get rid of the unnecessary number(s), on the empty lines, at the very end, You should get something like below :

              01<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              01    <userId></userId>
              01    <criteriaName></criteriaName>
              01    <fromDnCriteria>
              01        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              01        <includeAnonymousCallers>false</includeAnonymousCallers>
              01        <includeUnavailableCallers>false</includeUnavailableCallers>
              01        <phoneNumber></phoneNumber>
              01    </fromDnCriteria>
              01    <blacklisted>false</blacklisted>
              01</command>
              02<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              02    <userId></userId>
              02    <criteriaName></criteriaName>
              02    <fromDnCriteria>
              ..........
              ..........
              11    </fromDnCriteria>
              11    <blacklisted>false</blacklisted>
              11</command>
              12<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              12    <userId></userId>
              12    <criteriaName></criteriaName>
              12    <fromDnCriteria>
              12        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              12        <includeAnonymousCallers>false</includeAnonymousCallers>
              12        <includeUnavailableCallers>false</includeUnavailableCallers>
              12        <phoneNumber></phoneNumber>
              12    </fromDnCriteria>
              12    <blacklisted>false</blacklisted>
              12</command>
              

              Then,

              • Move back, again, to the first line of text ( 01<command xsi.... )

              • Place the cursor between 01 and <command xsi.... ( IMPORTANT )

              • Open, again, the Column editor ( Alt + C or Editor > Column Editor... )

              • Select the option Number to Insert

              • Type 1 as Initial number

              • Type 1 as Increase by

              • Type 1 as Repeat

              • Check the Leading zeros option ( IMPORTANT )

              • Verify that the Dec format is selected

              • Click on the OK button

              This time, we get the following text :

              01001<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              01002    <userId></userId>
              01003    <criteriaName></criteriaName>
              01004    <fromDnCriteria>
              01005        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              01006        <includeAnonymousCallers>false</includeAnonymousCallers>
              01007        <includeUnavailableCallers>false</includeUnavailableCallers>
              01008        <phoneNumber></phoneNumber>
              01009    </fromDnCriteria>
              01010    <blacklisted>false</blacklisted>
              01011</command>
              02012<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              02013    <userId></userId>
              02014    <criteriaName></criteriaName>
              02015    <fromDnCriteria>
              ..........
              ..........
              11119    </fromDnCriteria>
              11120    <blacklisted>false</blacklisted>
              11121</command>
              12122<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              12123    <userId></userId>
              12124    <criteriaName></criteriaName>
              12125    <fromDnCriteria>
              12126        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              12127        <includeAnonymousCallers>false</includeAnonymousCallers>
              12128        <includeUnavailableCallers>false</includeUnavailableCallers>
              12129        <phoneNumber></phoneNumber>
              12130    </fromDnCriteria>
              12131    <blacklisted>false</blacklisted>
              12132</command>
              

              Quite logical : this second numbering reaches number 132 as it corresponds to the total of 12 templates of 11 lines !


              Now, let’s suppose that we would like to fill up, simultaneously, in the XML templates, these 3 XML following elements :

              <userId></userId>
              <criteriaName></criteriaName>
              <phoneNumber></phoneNumber>

              with 12 values, stored in 3 text files. For instance, let’s suppose that :

              • The user-Id values are :
              569AB56AZ
              123CD12AY
              89CD1HJ
              9999AZ0000AR
              1AA52ZZ
              956AH45
              ZZA125G
              0000000000
              999
              AAAAAAA
              ZZZZZZZ
              ABCDE
              
              • The criteriaName values are :
              ONE
              TWO
              THREE
              FOUR
              FIVE
              SIX
              SEVEN
              EIGHT
              NINE
              TEN
              ELEVEN
              TWELVE
              
              • The phoneNumber values are :
              01 23 45 67 89
              99 98 97 96 95
              00 01 02 03 04
              99 00 99 00 99
              00 00 11 11 22
              11 22 33 44 55
              66 77 88 99 00
              98 76 54 32 10
              00 00 01 11 11
              99 00 88 11 77
              66 22 55 33 44
              99 99 99 00 00
              

              Then , number the lines of these 3 lists of data, at column 1, using the previous classical numbering and, then, gather these values in a single block, as below :

              01569AB56AZ
              02123CD12AY
              0389CD1HJ
              049999AZ0000AR
              051AA52ZZ
              06956AH45
              07ZZA125G
              080000000000
              09999
              10AAAAAAA
              11ZZZZZZZ
              12ABCDE
              01ONE
              02TWO
              03THREE
              04FOUR
              05FIVE
              06SIX
              07SEVEN
              08EIGHT
              09NINE
              10TEN
              11ELEVEN
              12TWELVE
              0101 23 45 67 89
              0299 98 97 96 95
              0300 01 02 03 04
              0499 00 99 00 99
              0500 00 11 11 22
              0611 22 33 44 55
              0766 77 88 99 00
              0898 76 54 32 10
              0900 00 01 11 11
              1099 00 88 11 77
              1166 22 55 33 44
              1299 99 99 00 00
              

              Now, in addition to this 2 digits numbering, we’re going to choose a symbol, with Unicode code > \x39, for each type of data and insert it, right after the numbering. I chose, randomly, the :, = and @ symbols. In order to line up with the resulting numbering of the templates, above, we’ll repeat each symbol, 3 times. So, we get :

              01:::569AB56AZ
              02:::123CD12AY
              03:::89CD1HJ
              04:::9999AZ0000AR
              05:::1AA52ZZ
              06:::956AH45
              07:::ZZA125G
              08:::0000000000
              09:::999
              10:::AAAAAAA
              11:::ZZZZZZZ
              12:::ABCDE
              01===ONE
              02===TWO
              03===THREE
              04===FOUR
              05===FIVE
              06===SIX
              07===SEVEN
              08===EIGHT
              09===NINE
              10===TEN
              11===ELEVEN
              12===TWELVE
              01@@@01 23 45 67 89
              02@@@99 98 97 96 95
              03@@@00 01 02 03 04
              04@@@99 00 99 00 99
              05@@@00 00 11 11 22
              06@@@11 22 33 44 55
              07@@@66 77 88 99 00
              08@@@98 76 54 32 10
              09@@@00 00 01 11 11
              10@@@99 00 88 11 77
              11@@@66 22 55 33 44
              12@@@99 99 99 00 00
              

              Finally, let’s paste that global list, at the end of the new tab, after the 12 copies of your template.

              We obtain :

              01001<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              01002    <userId></userId>
              01003    <criteriaName></criteriaName>
              01004    <fromDnCriteria>
              01005        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              01006        <includeAnonymousCallers>false</includeAnonymousCallers>
              01007        <includeUnavailableCallers>false</includeUnavailableCallers>
              01008        <phoneNumber></phoneNumber>
              01009    </fromDnCriteria>
              01010    <blacklisted>false</blacklisted>
              01011</command>
              02012<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              02013    <userId></userId>
              02014    <criteriaName></criteriaName>
              02015    <fromDnCriteria>
              ..........
              ..........
              11119    </fromDnCriteria>
              11120    <blacklisted>false</blacklisted>
              11121</command>
              12122<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              12123    <userId></userId>
              12124    <criteriaName></criteriaName>
              12125    <fromDnCriteria>
              12126        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              12127        <includeAnonymousCallers>false</includeAnonymousCallers>
              12128        <includeUnavailableCallers>false</includeUnavailableCallers>
              12129        <phoneNumber></phoneNumber>
              12130    </fromDnCriteria>
              12131    <blacklisted>false</blacklisted>
              12132</command>
              01:::569AB56AZ
              02:::123CD12AY
              03:::89CD1HJ
              04:::9999AZ0000AR
              05:::1AA52ZZ
              06:::956AH45
              07:::ZZA125G
              08:::0000000000
              09:::999
              10:::AAAAAAA
              11:::ZZZZZZZ
              12:::ABCDE
              01===ONE
              02===TWO
              03===THREE
              04===FOUR
              05===FIVE
              06===SIX
              07===SEVEN
              08===EIGHT
              09===NINE
              10===TEN
              11===ELEVEN
              12===TWELVE
              01@@@01 23 45 67 89
              02@@@99 98 97 96 95
              03@@@00 01 02 03 04
              04@@@99 00 99 00 99
              05@@@00 00 11 11 22
              06@@@11 22 33 44 55
              07@@@66 77 88 99 00
              08@@@98 76 54 32 10
              09@@@00 00 01 11 11
              10@@@99 00 88 11 77
              11@@@66 22 55 33 44
              12@@@99 99 99 00 00
              

              Now :

              • Perform a classical sort with the option Edit > Line Operations > Sort lines Lexicographically Ascending

              • Add an empty line-break, at the end of the sorted text ( IMPORTANT )

              Text should be, now, changed, as below :

              01001<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              01002    <userId></userId>
              01003    <criteriaName></criteriaName>
              01004    <fromDnCriteria>
              01005        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              01006        <includeAnonymousCallers>false</includeAnonymousCallers>
              01007        <includeUnavailableCallers>false</includeUnavailableCallers>
              01008        <phoneNumber></phoneNumber>
              01009    </fromDnCriteria>
              01010    <blacklisted>false</blacklisted>
              01011</command>
              01:::569AB56AZ
              01===ONE
              01@@@01 23 45 67 89
              02012<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              02013    <userId></userId>
              02014    <criteriaName></criteriaName>
              02015    <fromDnCriteria>
              02016        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              02017        <includeAnonymousCallers>false</includeAnonymousCallers>
              02018        <includeUnavailableCallers>false</includeUnavailableCallers>
              02019        <phoneNumber></phoneNumber>
              02020    </fromDnCriteria>
              02021    <blacklisted>false</blacklisted>
              02022</command>
              02:::123CD12AY
              02===TWO
              02@@@99 98 97 96 95
              03023<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              03024    <userId></userId>
              03025    <criteriaName></criteriaName>
              ..........
              ..........
              11118        <phoneNumber></phoneNumber>
              11119    </fromDnCriteria>
              11120    <blacklisted>false</blacklisted>
              11121</command>
              11:::ZZZZZZZ
              11===ELEVEN
              11@@@66 22 55 33 44
              12122<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
              12123    <userId></userId>
              12124    <criteriaName></criteriaName>
              12125    <fromDnCriteria>
              12126        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
              12127        <includeAnonymousCallers>false</includeAnonymousCallers>
              12128        <includeUnavailableCallers>false</includeUnavailableCallers>
              12129        <phoneNumber></phoneNumber>
              12130    </fromDnCriteria>
              12131    <blacklisted>false</blacklisted>
              12132</command>
              12:::ABCDE
              12===TWELVE
              12@@@99 99 99 00 00
              

              Sorry, the rest in the following post !

              1 Reply Last reply Reply Quote 2
              • G
                guy038
                last edited by guy038 Mar 15, 2019, 11:53 PM Mar 15, 2019, 4:23 PM

                Hi, all,

                This method is almost finished ! Now, we’re going to fill up the different XML elements, with their respective values, using the generic regex S/R, below :

                SEARCH (?-s)^\d+.*<(TAG)>(?=</\1>(.|\R)+?^\d+Symbol+(.+)\R)|^\d+Symbol+(.+)\R

                REPLACE ?1$0\3

                Where :

                • TAG = userId or criteriaName or phoneNumber

                • Symbol = : or = or @

                This leads to the 3 correct search regexes :

                • SEARCH (?-s)^\d+.*<(userId)>(?=</\1>(.|\R)+?^\d+:+(.+)\R)|^\d+:+(.+)\R
                • SEARCH (?-s)^\d+.*<(criteriaName)>(?=</\1>(.|\R)+?^\d+=+(.+)\R)|^\d+=+(.+)\R
                • SEARCH (?-s)^\d+.*<(phoneNumber)>(?=</\1>(.|\R)+?^\d+@+(.+)\R)|^\d+@+(.+)\R

                with the unique replacement

                • REPLACE ?1$0\3

                After running, successively, these 3 S/R ( 24 occurrences replaced for each ), we almost get your final text :

                01001<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                01002    <userId>569AB56AZ</userId>
                01003    <criteriaName>ONE</criteriaName>
                01004    <fromDnCriteria>
                01005        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
                01006        <includeAnonymousCallers>false</includeAnonymousCallers>
                01007        <includeUnavailableCallers>false</includeUnavailableCallers>
                01008        <phoneNumber>01 23 45 67 89</phoneNumber>
                01009    </fromDnCriteria>
                01010    <blacklisted>false</blacklisted>
                01011</command>
                02012<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                02013    <userId>123CD12AY</userId>
                02014    <criteriaName>TWO</criteriaName>
                02015    <fromDnCriteria>
                02016        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
                02017        <includeAnonymousCallers>false</includeAnonymousCallers>
                02018        <includeUnavailableCallers>false</includeUnavailableCallers>
                02019        <phoneNumber>99 98 97 96 95</phoneNumber>
                02020    </fromDnCriteria>
                02021    <blacklisted>false</blacklisted>
                02022</command>
                03023<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                03024    <userId>89CD1HJ</userId>
                03025    <criteriaName>THREE</criteriaName>
                ..........
                ..........
                11117        <includeUnavailableCallers>false</includeUnavailableCallers>
                11118        <phoneNumber>66 22 55 33 44</phoneNumber>
                11119    </fromDnCriteria>
                11120    <blacklisted>false</blacklisted>
                11121</command>
                12122<command xsi:type="UserSelectiveCallRejectionAddCriteriaRequest16" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                12123    <userId>ABCDE</userId>
                12124    <criteriaName>TWELVE</criteriaName>
                12125    <fromDnCriteria>
                12126        <fromDnCriteriaSelection>Specified Only</fromDnCriteriaSelection>
                12127        <includeAnonymousCallers>false</includeAnonymousCallers>
                12128        <includeUnavailableCallers>false</includeUnavailableCallers>
                12129        <phoneNumber>99 99 99 00 00</phoneNumber>
                12130    </fromDnCriteria>
                12131    <blacklisted>false</blacklisted>
                12132</command>
                

                Notes :

                • That generic regex has two alternatives :

                  • ^\d+.*<(TAG)>(?=</\1>(.|\R)+?(^\d+Symbol+(.+)\R) , which looks for text from beginning of current line till the opening TAG, stored as group 1, only if the line ^\d+Symbol+(.+)\R can be found, further on

                  • ^\d+Symbol+(.+)\R , which searches any complete line, containing the symbols ( :, = or @ ) and the different values

                • In replacement, we just add the appropriate value ( \3 ), to the current XML element ( $0 ), only if group 1 exits ( ?1 ). When the second alternative is found, it’s just deleted because group 1 does not exist !


                To end, we just have to get rid of the 5 digits, at beginning of all the lines, which can be easily achieved with the regex S/R :

                SEARCH ^\d{5}

                REPLACE Leave EMPTY

                Remark :

                • I’m pretty confident about the generic regex S/R, for, at least, two reasons :

                  • Due to the sort operation, the different values, to insert in the XML document, are moved at the end of each template Thus , they are not very far from the location where they should end !

                  • I tested with a XML template of more than 400 lines, repeated 5 times, without any problem, For instance, there was more than 23,500 characters between the first <userId>.....</userId> block and the line 1:::::569AB56AZ containing the value to insert after <user>. However, the regex correctly associates the tag <userId> to its respective value 569AB56AZ, thanks to the look-ahead feature !

                Best Regards

                guy038

                1 Reply Last reply Reply Quote 2
                • P
                  Per Elkjær Nielsen
                  last edited by Mar 21, 2019, 1:14 PM

                  Hi guy038

                  It’s a very impressive workaround you’ve come to. It’s not easy on , but it works for purposes I wanted

                  At the same time, it has been very helpfull to follow your guides on using Regex, Which inspire me to try on my own to create simelar xml templates

                  Many thanks and sorry the long response time

                  Br Per

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