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


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 1  
Moving XML tag/contents after specific XML tag within same file

Hi Forum.

I have an XML file with the following requirement to move the <AdditionalAccountHolders> tag and its content right after the <accountHolderName> tag within the same file but I'm not sure how to accomplish this through a Unix script.

Any feedback will be greatly appreciated.

Thanks.

Before 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>xx</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>

After 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>
  <AdditionalAccountHolders>
    <additionalAccountHolderName>bbb</additionalAccountHolderName>
  </AdditionalAccountHolders>
  <payeeName></payeeName>
  <jointAccountRelationshipCode>xx</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>

# 2  
a bit verbose, but...
Code:
awk '
FNR==NR {
   if (/<AdditionalAccountHolders/) {s=$0;f++;next}
   if (f) s= s ORS $0
   if (/<[/]AdditionalAccountHolders/) f=0
   next
}
/<accountHolderName/ {print $0 ORS s;next}
/<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
1' myXMLfile myXMLfile

OR a bit less verbose:
Code:
awk '
  FNR==NR && /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {s=(s)?s ORS $0:$0;next}
  /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
  /<accountHolderName/ {print $0 ORS s;s="";next}
  1' myXMLfile myXMLfile


Last edited by vgersh99; 08-14-2018 at 07:12 PM..
# 3  
Hi vgersh99.

Thank you for the awk code suggestions. I tried both of your codes with 2 records in my XML file:

1) code#1 doesn't return any records
2) code#2 does return records but it's putting the <AdditionalAccountHolders> information from record#1 into record#2 and record#1 does not have the <AdditionalAccountHolders> tag in the new file. Please see sample data below:

Before 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>
  </AdditionalAccountHolders>
</property>
</holder>

After 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>   
</property>
</holder>


<holder>
<property>
  <accountHolderName>ddd</accountHolderName>
  <AdditionalAccountHolders>
    <additionalAccountHolderName>bbb</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>

# 4  
well... your original sample data contained only ONE holder record - not 2 as in the new sample.
You should be more descriptive in the future...
Let me rework the suggestion with the NEW sample.
This User Gave Thanks to vgersh99 For This Post:
# 5  
My XML file will contain many records - some records will have no holder records and some records may have 1 to 3 holder records.
# 6  
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 myXMLfile

# 7  
Hello,

XML Block warden speaking here Smilie

The question states that you use XML in an unefficient way. The ordering of an XML file is irrelevant, in terms of standardization undefined, can change spontaneously and with the right tools ordering isn't needed at all.

So scripts, that try to set up an order of elements are likely to break at slightest differences of the XML Layout.

Regards,
Stomp

Update: Some Examples how to read data from that xml file:

Read all accountHolderName Attributes
Code:
xmllint --xpath "//accountHolderName/text()" data.xml

Read all additionalAccountHolderName Attributes
Code:
xmllint --xpath "//additionalAccountHolderName/text()" data.xml

Note

xmllint complains that this data is not valid XML. I added a </holders> tag at the end of your xml-data, to fix it.

Last edited by stomp; 08-15-2018 at 12:53 PM..
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #598
Difficulty: Medium
C does not support a traditional foreach loop.
True or False?

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

Featured Tech Videos