2016-04-02 2 views
0

Я начал программирование в R сегодня, и я хочу получить некоторые значения на основе XML-файла (с библиотекой «XML»).Фильтровать XML по значению узла в R

XML ниже - упрощенная версия реального.

<PDBx:datablock xmlns:PDBx="http://pdbml.pdb.org/schema/pdbx-v40.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" datablockName="1AEW" xsi:schemaLocation="http://pdbml.pdb.org/schema/pdbx-v40.xsd pdbx-v40.xsd"> 
    <PDBx:atom_siteCategory> 
     <PDBx:atom_site id="1"> 
     <PDBx:Cartn_x>22.250</PDBx:Cartn_x> 
     <PDBx:Cartn_y>-18.232</PDBx:Cartn_y> 
     <PDBx:Cartn_z>52.362</PDBx:Cartn_z> 
     <PDBx:label_atom_id>N</PDBx:label_atom_id> 
     </PDBx:atom_site> 

     <PDBx:atom_site id="2"> 
     <PDBx:Cartn_x>22.188</PDBx:Cartn_x> 
     <PDBx:Cartn_y>-19.614</PDBx:Cartn_y> 
     <PDBx:Cartn_z>52.835</PDBx:Cartn_z> 
     <PDBx:label_atom_id>CA</PDBx:label_atom_id> 
     </PDBx:atom_site> 
. 
. 
. 

Что нужно извлечь это (х, у, г) координаты всех «atom_site» узлы, которые имеют значение «CA» внутри своего узла «label_atom_id».

я уже искал, и это то, что я нашел:

nodes = getNodeSet(xmltop[[1]], "//atom_siteCategory/atom_site[@label_atom_id='CA']"); 

xmltop[[1]] Я использую, потому что я хочу, чтобы найти узел «atom_siteCategory». Это узел, содержащий все узлы «atom_site».

Проблема с этим XPATH заключается в том, что atom_site[@label_atom_id='CA] работает для атрибутов узла, а не значений узлов.

В нескольких словах: 1) Как получить atom_site узлы с "CA" как значение label_atom_id. (какой XPATH использовать)

2) Как извлечь из этих узлов 3 координаты (x, y, z). (Как заполнить data.frame с этим координаты)

ответ

0

Хорошо, я нашел решение:

#Changes program path to paramenter absolute path 
setwd("C:/Users/MyUser/Desktop/App") 
#Let's user choose xml file (can be replaced with absolute path) 
file = file.choose(new = FALSE) 
#Pases xml file 
xmlfile = xmlParse(file) 
class(xmlfile) 
#Gets top node 
xmltop = xmlRoot(xmlfile) 
#Filters node with XPATH 
nodes = getNodeSet(xmltop, "/PDBx:datablock/PDBx:atom_siteCategory/PDBx:atom_site[PDBx:label_atom_id='CA']") 
#Turns node list into dataframe 
extract = xmlSApply(nodes, function(x) xmlSApply(x, xmlValue)) 
df = data.frame(t(extract), row.names = NULL) 
#Gets column subset (X, Y, Z) coordinates 
df2 = df[, c(2,3,4)] 
#Changes original names to X, Y and Z 
df2 = setNames(df2, c("Cartn_x" = "X", "Cartn_y" = "Y", "Cartn_z" = "Z")) 
#Prints the data frame 
print.data.frame(df2) 

Я надеюсь, что это помогает кому-то.

Смежные вопросы