Page 1 of 1
Oxygen XML Multiple File Question
Posted: Fri Jun 08, 2012 12:24 am
by bluerift
I'm currently trying to edit 8,000 XML files that are all in 8,000 separate folders.
In between nodes 2 and 3, I need to insert a new node. This node would be the same throughout the 8000 files that are in the 8000 separate folders. My problem is I do not want to do this manually because it is going A LONG TIME.
Can someone help me figure out if Oxygen can do this within it's GUI?
If someone can help me, I would HIGHLY appreciate it!
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<1>
<2>
<New Node>
<3>
<4>
<5>
</Properties>
</DocClass>
Re: Oxygen XML Multiple File Question
Posted: Fri Jun 08, 2012 6:35 pm
by adrian
Hi,
If you simply want to insert a sibling between "2" and "3" you could use the
Find -> Find/Replace in Files tool to do this.
First create a backup copy of your files.
Your example is a bit broken XML-wise so I'm using a well-formed one. So, for:
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<a1/>
<a2/>
<a3/>
<a4/>
<a5/>
</DocClass>
to insert a
newNode between
a2 and
a3 you can:
Search for:
<a3
Restrict to XPath (this restricts the search to all a3 elements preceded by an a2 element):
//a3[preceding-sibling::*[1][name() = 'a2']]
Replace with ($0 puts back the searched match: <a3):
<newNode/>$0
Regards,
Adrian
Re: Oxygen XML Multiple File Question
Posted: Fri Jun 08, 2012 10:13 pm
by bluerift
Adrian,
Unfortunately after I followed your example, a new node was not placed in between nodes a2 and a3. Only a3 was replaced.
Using this XML:
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<a1/>
<a2/>
<a3/>
<a4/>
<a5/>
</DocClass>
I went to Find/Replace and entered these variables into the following text boxes.
Text To Find: <a3
Replace With: <newNode/>$0
XPath: //a3[preceding-sibling::*[1][name() = 'a2']]
After clicking replace, my code is now incorrect.
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<a1/>
<a2/>
<newNode/>$0/>
<a4/>
<a5/>
</DocClass>
If you could please help me figure out what I'm doing wrong, I would highly appreciate it!
Re: Oxygen XML Multiple File Question
Posted: Fri Jun 08, 2012 10:38 pm
by Costin
Hello,
In addition to what my colleague Adrian advised, could you please also enable the "Regular expresion" checkbox in the Find/Replace dialog and see if that gives you the desired results ?
Best Regards,
Costin
Re: Oxygen XML Multiple File Question
Posted: Sat Jun 09, 2012 12:17 am
by bluerift
Costin,
After checking the Regular Expression in the Find/Replace dialog underneath options. This is the code that is being shown.
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<a1/>
<a2/>
<newNode/><a3/>
<a4/>
<a5/>
</DocClass>
I want it to look like this:
<?xml version="1.0" encoding="UTF-8"?>
<DocClass>
<a1>
<a2>
<newNode>
<a3>
<a4>
<a5>
</DocClass>
Re: Oxygen XML Multiple File Question
Posted: Mon Jun 11, 2012 10:30 am
by adrian
If you want the new node on a separate line, insert a new line in the replace string. Use Replace With:
<newNode/>\n$0
Regards,
Adrian
Re: Oxygen XML Multiple File Question
Posted: Tue Jun 12, 2012 7:28 pm
by bluerift
Adrian,
Use Replace With: <newNode/>\n$0
Worked absolutely perfectly for me.
___________________________________________________
I have another question for you kind sir.
I now need to put a new node on a separate line between a child node and a parent node. The newNode needs to be located between the parent <Properties> and <a1/> the child.
<DocClass>
<Properties>
<newNode>
<a1/>
<a2/>
<a3/>
</Properties>
In order to successfully accomplish this, what information would I need to fill into the the following text boxes?
Text To Find: ?
Replace With: ?
XPATH: ?
Re: Oxygen XML Multiple File Question
Posted: Wed Jun 13, 2012 3:59 pm
by Costin
Hi,
You can achieve what you want in 2 ways.
1. The first and the easier one would be to place
<a1 in the
Text to find filed, and
replace it with the same as previously
<newNode/>\n$0 value. As the
XPath condition, use
Code: Select all
//a1[parent::Properties/*[1][self::a1]]
. This will find all the "a1" childs of the "Properties" element, starting with the first one.
2. However, a more complex but more accurate way to restrict the match only to the first occurrence of the <a1> element and also only if it is the first child of "Properties" would be to use the
Code: Select all
//*[1][self::a1 and parent::Properties]
XPath expression.
You should choose any of the solutions proposed above, depending on your XML structure and on what you want to achieve.
Regards,
Costin