[R] Removing or overwriting an XML subtree

Steffen Neumann sneumann at ipb-halle.de
Thu Jul 3 23:26:01 CEST 2008


Hi Martin,

thanks for your reply, I'll give it a try. My current problem is 
to map my problem to your suggestion of modifying the tree 
*at parsing time*. 

(Of course) my problem is more complex than my first example,
sorry for any confusion caused.

The XML looks more like this:

<root>
  <complex>stuff</complex>
  <list>
    <element>
      <param name="x" value="a"/>
      <param name="y" value="b"/>
      <more params/>
    </element>
    <element>
      <param name="x" value="i"/>
      <param name="y" value="b"/>
      <more params/>
    </element>
  <list>
  <more complex>stuff</more complex>
</root>

and I have my own set of values for "x",
so I want to use the first <element> as a template 
for my own <element>s, setting the value="" of name="x" 
to my new values. Finally I want to replace the whole <list> 
with my own <list> of my new <element>s.

My number of elements will not correspond 
to the number of <element>s in the template file.

So the handlers would need to read ahead to find the first <element>,
create copies of that for each of my values="" and return 
the new <list> instead of the one in the file.

I might have to read the file twice, first to obtain the <element>
as a template, create my <list> of these new <element>s, and then 
use the handler approach to insert my replacement <list>.

Because there is a lot of <complex stuff/> in there, 
I can't write the XML tree from scratch.
If anyone has suggestions how to parse the file, 
find the template <element>, create a <list> of them,
and finally replace the original <list>, I am all ears ;-)

Yours,
Steffen


On Wed, 2008-07-02 at 21:00 -0700, Martin Morgan wrote:
> Hi Steffen...
> 
> Steffen Neumann <sneumann at ipb-halle.de> writes:
...
> I'm not sure how to do this with internal nodes, but
> 
> handlers = list(
>   first=function(node, ...) {
>       init <- sub("^([[:upper:]]).*$", "\\1.", xmlValue(node))
>       xmlNode("initial", init)
>   })
> xml <- xmlTreeParse("~/tmp/tr.xml", handlers=handlers, asTree=TRUE)
> 
> gives
> > xmlRoot(xml)
> <Duncan>
>  <name a="1" b="xyz">
>   <initial>D.</initial>
>   <last>Temple Lang</last>
>  </name>
> </Duncan>
> 
> The documentation of xmlTreeParse is written to almost imply that this
> would also work with internal nodes, but I was not able to work
> through this.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20080703/cf0dd2fe/attachment.bin>


More information about the R-help mailing list