XMLInternalDocument.RdThis class is used to provide a handle/reference to a C-level
data structure that contains the information from parsing
parsing XML content.
This leaves the nodes in the DOM or tree as C-level nodes
rather than converting them to explicit R XMLNode
objects. One can then operate on this tree in much the same
way as one can the XMLNode representations,
but we a) avoid copying the nodes to R, and b) can navigate
the tree both down and up using xmlParent
giving greater flexibility.
Most importantly, one can use an XMLInternalDocument
class object with an XPath expression to easily and relatively efficiently
find nodes within a document that satisfy some criterion.
See getNodeSet.
Objects of this type are created via
xmlTreeParse
and htmlTreeParse
with the argument useInternalNodes given as TRUE.
Class oldClass, directly.
There are methods to serialize (dump) a document to a file or as a string, and to coerce it to a node by finding the top-level node of the document. There are functions to search the document for nodes specified by an XPath expression.
f = system.file("exampleData", "mtcars.xml", package="XML")
doc = xmlParse(f)
getNodeSet(doc, "//variables[@count]")
#> [[1]]
#> <variables count="11">
#> <variable unit="Miles/gallon">mpg</variable>
#> <variable>cyl</variable>
#> <variable>disp</variable>
#> <variable>hp</variable>
#> <variable>drat</variable>
#> <variable>wt</variable>
#> <variable>qsec</variable>
#> <variable>vs</variable>
#> <variable type="FactorVariable" levels="automatic,manual">am</variable>
#> <variable>gear</variable>
#> <variable>carb</variable>
#> </variables>
#>
#> attr(,"class")
#> [1] "XMLNodeSet"
getNodeSet(doc, "//record")
#> [[1]]
#> <record id="Mazda RX4"> 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4</record>
#>
#> [[2]]
#> <record id="Mazda RX4 Wag"> 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4</record>
#>
#> [[3]]
#> <record id="Datsun 710"> 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1</record>
#>
#> [[4]]
#> <record id="Hornet 4 Drive"> 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1</record>
#>
#> [[5]]
#> <record id="Hornet Sportabout"> 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2</record>
#>
#> [[6]]
#> <record id="Valiant"> 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1</record>
#>
#> [[7]]
#> <record id="Duster 360"> 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4</record>
#>
#> [[8]]
#> <record id="Merc 240D"> 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2</record>
#>
#> [[9]]
#> <record id="Merc 230"> 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2</record>
#>
#> [[10]]
#> <record id="Merc 280"> 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4</record>
#>
#> [[11]]
#> <record id="Merc 280C"> 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4</record>
#>
#> [[12]]
#> <record id="Merc 450SE"> 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3</record>
#>
#> [[13]]
#> <record id="Merc 450SL"> 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3</record>
#>
#> [[14]]
#> <record id="Merc 450SLC"> 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3</record>
#>
#> [[15]]
#> <record id="Cadillac Fleetwood"> 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4</record>
#>
#> [[16]]
#> <record id="Lincoln Continental"> 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4</record>
#>
#> [[17]]
#> <record id="Chrysler Imperial"> 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4</record>
#>
#> [[18]]
#> <record id="Fiat 128"> 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1</record>
#>
#> [[19]]
#> <record id="Honda Civic"> 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2</record>
#>
#> [[20]]
#> <record id="Toyota Corolla"> 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1</record>
#>
#> [[21]]
#> <record id="Toyota Corona"> 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1</record>
#>
#> [[22]]
#> <record id="Dodge Challenger"> 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2</record>
#>
#> [[23]]
#> <record id="AMC Javelin"> 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2</record>
#>
#> [[24]]
#> <record id="Camaro Z28"> 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4</record>
#>
#> [[25]]
#> <record id="Pontiac Firebird"> 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2</record>
#>
#> [[26]]
#> <record id="Fiat X1-9"> 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1</record>
#>
#> [[27]]
#> <record id="Porsche 914-2"> 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2</record>
#>
#> [[28]]
#> <record id="Lotus Europa"> 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2</record>
#>
#> [[29]]
#> <record id="Ford Pantera L"> 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4</record>
#>
#> [[30]]
#> <record id="Ferrari Dino"> 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6</record>
#>
#> [[31]]
#> <record id="Maserati Bora"> 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8</record>
#>
#> [[32]]
#> <record id="Volvo 142E"> 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2</record>
#>
#> attr(,"class")
#> [1] "XMLNodeSet"
getNodeSet(doc, "//record[@id='Mazda RX4']")
#> [[1]]
#> <record id="Mazda RX4"> 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4</record>
#>
#> attr(,"class")
#> [1] "XMLNodeSet"
# free(doc)