Moving XML tag/contents after specific XML tag within same file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Moving XML tag/contents after specific XML tag within same file
# 8  
Old 08-15-2018
Hi Stomp.

I realize that the order of tags does not matter but unfortunately we are building the XML file for an external client and they are requesting that the <AdditionalAccountHolders> info follows right after <AccountHolderName>.

Thanks.
# 9  
Old 08-15-2018
Quote:
Originally Posted by pchang
My XML file will contain many records - some records will have no holder records and some records may have 1 to 3 holder records.
Was the last sample file representative of all the cases or not?
If not, provide small representative sample.

Have you tried the latest suggestion in post 6?
# 10  
Old 08-15-2018
Quote:
Originally Posted by pchang
I realize that the order of tags does not matter but unfortunately we are building the XML file for an external client and they are requesting that the <AdditionalAccountHolders> info follows right after <AccountHolderName>.
Well that's bad. If possible, tell them how to do it more efficiently.

Using XML in such a way is a constant source of trouble.

Of course that's a matter of company policy wether the own company will do, what the client wants, even if it's total bullshit.

To put it clear

If you do it correctly according to the standards, you have lots of tools, which will help you with the task. If you do not obey the standards, your client is on his own, probably writing very bad and difficult to maintain code.

There are lots of good XML tools out there and libraries are widespread in a lot of programming languages.

Last edited by stomp; 08-15-2018 at 12:05 PM..
# 11  
Old 08-15-2018
Quote:
Originally Posted by vgersh99
how about:
Code:
awk '
  /<accountHolderName/ {accH=FNR}
   FNR==NR {
     if (/<AdditionalAccountHolders/) {s[accH]=$0;f++;next}
     if (f) s[accH]= s[accH] ORS $0
     if (/<[/]AdditionalAccountHolders/) f=0
     next
   }
   /<accountHolderName/ {print $0 ORS s[accH];next}
   /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
   1' myXMLfile

Sorry vgersh99 - the above awk code did not return any records - Please have a look.

myXMLfile contains the following good representative data:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<holders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<holder>
<property>
  <accountHolderName>aaa</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>aa</jointAccountRelationshipCode>
  <accountInstrumentNumber>1234567890</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20071217</dateOfLastTransaction>
  <balanceAmount>4076</balanceAmount>
  <streetAddress1>55 West Road</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Chilliwack</city>
  <province>BC</province>
  <postalCode>V2L 3S8</postalCode>
  <countryCode>CA</countryCode>   
  <AdditionalAccountHolders>
    <additionalAccountHolderName>bbb</additionalAccountHolderName>
  </AdditionalAccountHolders>
</property>
</holder>


<holder>
<property>
  <accountHolderName>ddd</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>xx</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Roadside</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>   
  <AdditionalAccountHolders>
    <additionalAccountHolderName>eee</additionalAccountHolderName>
    <additionalAccountHolderName>fff</additionalAccountHolderName>
  </AdditionalAccountHolders>
</property>
</holder>

<holder>
<property>
  <accountHolderName>ggg</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>gg</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Albert</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>     
</property>
</holder>

------ Post updated at 11:19 AM ------

Quote:
Originally Posted by stomp
Well that's bad. If possible, tell them how to do it more efficiently.

Using XML in such a way is a constant source of trouble.

Of course that's a matter of company policy wether the own company will do, what the client wants, even if it's total bullshit.

To put it clear

If you do it correctly according to the standards, you have lots of tools, which will help you with the task. If you do not obey the standards, your client is on his own, probably writing very bad and difficult to maintain code.

There are lots of good XML tools out there and libraries are widespread in a lot of programming languages.
I'm dealing with a branch of government. Smilie

Last edited by pchang; 08-15-2018 at 12:18 PM.. Reason: updated info
# 12  
Old 08-15-2018
a slight mod:
Code:
awk '
  /<accountHolderName/ {accH=FNR}
  FNR==NR {
     if (/<AdditionalAccountHolders/) {s[accH]=$0;f++;next}
     if (f) s[accH]= s[accH] ORS $0
     if (/<[/]AdditionalAccountHolders/) f=0
     next
  }
  /<accountHolderName/ && s[accH] {print $0 ORS s[accH];next}
  /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
  1' myXMLfile myXMLfile

Given your latest sample, I get:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<holders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<holder>
<property>
  <accountHolderName>aaa</accountHolderName>
  <AdditionalAccountHolders>
    <additionalAccountHolderName>bbb</additionalAccountHolderName>
  </AdditionalAccountHolders>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>aa</jointAccountRelationshipCode>
  <accountInstrumentNumber>1234567890</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20071217</dateOfLastTransaction>
  <balanceAmount>4076</balanceAmount>
  <streetAddress1>55 West Road</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Chilliwack</city>
  <province>BC</province>
  <postalCode>V2L 3S8</postalCode>
  <countryCode>CA</countryCode>
</property>
</holder>


<holder>
<property>
  <accountHolderName>ddd</accountHolderName>
  <AdditionalAccountHolders>
    <additionalAccountHolderName>eee</additionalAccountHolderName>
    <additionalAccountHolderName>fff</additionalAccountHolderName>
  </AdditionalAccountHolders>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>xx</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Roadside</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>
</property>
</holder>

<holder>
<property>
  <accountHolderName>ggg</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>gg</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Albert</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>
</property>
</holder>

This User Gave Thanks to vgersh99 For This Post:
# 13  
Old 08-15-2018
Thank you very much vgersh99.

Your code works great for all scenarios.

------ Post updated at 05:19 PM ------

Hi vgersh99.

Sorry to bother you again - My data requirement has changed slightly (it's one <AdditionalAccountHolders> tag per <additionalAccountHolderName> tag) and the current awk code does not work as expected anymore.

I have highlighted the data changes below for record#2. Would you kindly check the awk code? Thank you.

Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<holders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<holder>
<property>
  <accountHolderName>aaa</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>aa</jointAccountRelationshipCode>
  <accountInstrumentNumber>1234567890</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20071217</dateOfLastTransaction>
  <balanceAmount>4076</balanceAmount>
  <streetAddress1>55 West Road</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Chilliwack</city>
  <province>BC</province>
  <postalCode>V2L 3S8</postalCode>
  <countryCode>CA</countryCode>   
  <AdditionalAccountHolders>
    <additionalAccountHolderName>bbb</additionalAccountHolderName>
  </AdditionalAccountHolders>
</property>
</holder>


<holder>
<property>
  <accountHolderName>ddd</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>xx</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Roadside</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>

  <AdditionalAccountHolders>
    <additionalAccountHolderName>eee</additionalAccountHolderName>
  </AdditionalAccountHolders>
  <AdditionalAccountHolders>
    <additionalAccountHolderName>fff</additionalAccountHolderName>
  </AdditionalAccountHolders>
</property>
</holder>

<holder>
<property>
  <accountHolderName>ggg</accountHolderName>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>gg</jointAccountRelationshipCode>
  <accountInstrumentNumber>999999990</accountInstrumentNumber>
  <balanceType>6</balanceType>
  <dateOfLastTransaction>20081217</dateOfLastTransaction>
  <balanceAmount>556</balanceAmount>
  <streetAddress1>50 Albert</streetAddress1>
  <streetAddress2></streetAddress2>
  <city>Ontario</city>
  <province>ON</province>
  <postalCode>P3L 3S8</postalCode>
  <countryCode>CA</countryCode>     
</property>
</holder>

awk code:
Code:
awk '
  /<accountHolderName/ {accH=FNR}
  FNR==NR {
     if (/<AdditionalAccountHolders/) {s[accH]=$0;f++;next}
     if (f) s[accH]= s[accH] ORS $0
     if (/<[/]AdditionalAccountHolders/) f=0
     next
  }
  /<accountHolderName/ && s[accH] {print $0 ORS s[accH];next}
  /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
  1' myXMLfile myXMLfile

# 14  
Old 08-15-2018
what's expected based on the latest sample?

------ Post updated at 06:23 PM ------

how about:
Code:
awk '
  /<accountHolderName/ {accH=FNR}
  FNR==NR {
     if (/<AdditionalAccountHolders/) {s[accH]=(s[accH])?s[accH] ORS $0:$0;f++;next}
     if (f) s[accH]= s[accH] ORS $0
     if (/<[/]AdditionalAccountHolders/) f=0
     next
  }
  /<accountHolderName/ && s[accH] {print $0 ORS s[accH];next}
  /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
  1' myXMLfile myXMLfile

Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Grepping multiple XML tag results from XML file.

I want to write a one line script that outputs the result of multiple xml tags from a XML file. For example I have a XML file which has below XML tags in the file: <EMAIL>***</EMAIL> <CUSTOMER_ID>****</CUSTOMER_ID> <BRANDID>***</BRANDID> Now I want to grep the values of all these specified... (1 Reply)
Discussion started by: shubh752
1 Replies

2. Shell Programming and Scripting

To search for a particular tag in xml and collate all similar tag values and display them count

I want to basically do the below thing. Suppose there is a tag called object1. I want to display an output for all similar tag values under heading of Object 1 and the count of the xmls. Please help File: <xml><object1>house</object1><object2>child</object2>... (9 Replies)
Discussion started by: srkmish
9 Replies

3. Shell Programming and Scripting

XML Parse between to tag with upper tag

Hi Guys Here is my Input : <?xml version="1.0" encoding="UTF-8"?> <xn:MeContext id="01736"> <xn:VsDataContainer id="01736"> <xn:attributes> <xn:vsDataType>vsDataMeContext</xn:vsDataType> ... (12 Replies)
Discussion started by: pareshkp
12 Replies

4. Shell Programming and Scripting

How to add the multiple lines of xml tags before a particular xml tag in a file

Hi All, I'm stuck with adding multiple lines(irrespective of line number) to a file before a particular xml tag. Please help me. <A>testing_Location</A> <value>LA</value> <zone>US</zone> <B>Region</B> <value>Russia</value> <zone>Washington</zone> <C>Country</C>... (0 Replies)
Discussion started by: mjavalkar
0 Replies

5. Shell Programming and Scripting

How to retrieve the value from XML tag whose end tag is in next line

Hi All, Find the following code: <Universal>D38x82j1JJ </Universal> I want to retrieve the value of <Universal> tag as below: Please help me. (3 Replies)
Discussion started by: mjavalkar
3 Replies

6. Shell Programming and Scripting

how to retrieve specific parameters using a xml tag

Hi, I have the following code in my xml file: <aaaRule loginIdPattern=".*" orgIdPattern=".*" deny="false" /> <aaaRuleGroup name="dpaas"> <aaaRule loginIdPattern=".*" orgIdPattern=".*" deny="false" /> I want to retrieve orgIdPattern and loginIdPattern parameter value based on... (2 Replies)
Discussion started by: mjavalkar
2 Replies

7. Shell Programming and Scripting

XML tag replacement from different XML file

We have 2 XML file 1. ORIGINAL.xml file and 2. ATTRIBUTE.xml files, In the ORIGINAL.xml we need some modification as <resourceCode>431048</resourceCode>under <item type="Manufactured"> tag - we need to grab the 431048 value from tag and pass it to database table in unix shell script to find the... (0 Replies)
Discussion started by: balrajg
0 Replies

8. Shell Programming and Scripting

Extracting XML Tag Contents

Hi Jean I require your help in writing a shell script. Iam zero in Unix programming. I have a large file about 400 MB of data, which contains about 50000 XML messages seperated by a Tab, I think. I need to extract only 4 values from each XML message and write it onto a new file. Please help me... (2 Replies)
Discussion started by: pk_eee
2 Replies

9. Shell Programming and Scripting

how to get specific xml tag ?

sorry to trouble u guys again... i have this document here called record.txt and it contains this: 2005-12-05 10:53:17,551 INFO - message received... 2005-12-05 10:53:17,557 INFO - The XML message **************<berth_allocation xmln... (13 Replies)
Discussion started by: forevercalz
13 Replies
Login or Register to Ask a Question