[R] another XML package question
Antje
niederlein-rstat at yahoo.de
Mon Sep 8 15:35:00 CEST 2008
Hi Duncan,
thanks a lot for your explanations.
I tried the following now to understand a bit more:
data <- getNodeSet(doc, "//Data")
xmlName(data[[1]])
xmlName(xmlRoot(data[[1]]))
xpathApply(data[[1]], "./*", xmlName)
Is it right that using "data" in the xpathApply() somehow sets the current node
but does not change the root?
So looking for a subnode at all levels below my current node is not possible
with the xPath syntax? (search on all levels starting from root is possible
with "//nodename")
Antje
Duncan Temple Lang schrieb:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
>
> Antje wrote:
>> Hi there,
>>
>> does anybody know how to return the xmlPath from a node?
>> For example, at several location in the xml file, I have nodes with the
>> same name and I'd like to process only the nodes from a certain path.
>>
>> Any idea?
>
> As with your previous question, there are ways to do this
> with either XPath queries or R functions that operate on
> the nodes from the earlier queries.
>
> By "xmlPath", let's assume you mean the ordered collection of
> nodes from the node to the root node of the document,
> i.e. the collection of ancestor nodes.
> So using XPath, you could use
>
> a = getNodeSet( node, "ancestor::*")
>
> where node is the R variable containing the node within the tree
> whose ancestors you want, e.g.
> getNodeSet(doc, "//val")[[1]]
>
> The nodes in are in "reverse" order.
>
>
> You can do the same thing with the R function
> xmlParent(). To get the ancestors,
>
> tmp = xmlParent(node)
> ans = list()
> while( !is.null(tmp)) {
> ans = c(ans, tmp)
> tmp = xmlParent(tmp)
> }
>
> and of course in your case you could terminate the loop
> at any point.
>
>
> But a different approach to the problem is to use a more specific
> XPath query in the first place to get only the nodes of interest.
> For example, to get the <val> nodes in the second <data> node of
> your example, you could use
>
> getNodeSet(doc, "//data[2]/val")
>
> or to find all <val> nodes which have the attribute i = "t2",
>
> getNodeSet(doc, "//val[@i='t2']")
>
> Or to find all <val> nodes with an ancestor which have an ancestor
> with an attribute name "loc"
>
> getNodeSet(doc, "//*[@loc='1']//val")
>
>
>
> (
> The sample XML document was
>
> <root>
> <data loc="1">
> <val i="t1"> 22 </val>
> <val i="t2"> 45 </val>
> </data>
> <data loc="2">
> <val i="t1"> 44 </val>
> <val i="t2"> 11 </val>
> </data>
> </root>
>
> )
>
>
> D.
>
>> Antje
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (Darwin)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
>
> iEYEARECAAYFAkjE+fQACgkQ9p/Jzwa2QP6KBwCeImMuyCL0kpF/0eRqo77ywZj/
> AloAn3HRWaD+RDV+ZETRagtfV7zlJpk6
> =JtiD
> -----END PGP SIGNATURE-----
>
More information about the R-help
mailing list