Я пытаюсь проанализировать узлы и атрибуты файла XML.Внутри файла есть набор узлов с атрибутами.Вложенная структура XML похожа на фрейм данных, и я хочу разобрать это в фрейм данных.
Вот пример файла:
<?xml version="1.0" encoding="UTF-8"?>
<TrackMate version="3.8.0">
<Model spatialunits="µm" timeunits="sec">
<AllTracks>
<Track name="Track_2" TRACK_ID="2" NUMBER_SPOTS="140" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="960769" SPOT_TARGET_ID="960778" LINK_COST="0.08756957830926632" />
<Edge SPOT_SOURCE_ID="958304" SPOT_TARGET_ID="958308" LINK_COST="1.4003359672950089" />
<Edge SPOT_SOURCE_ID="958316" SPOT_TARGET_ID="958322" LINK_COST="1.6985623204008202" />
</Track>
<Track name="Track_145" TRACK_ID="145" NUMBER_SPOTS="141" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="961623" SPOT_TARGET_ID="961628" LINK_COST="2.2678642015413755" />
<Edge SPOT_SOURCE_ID="962122" SPOT_TARGET_ID="962127" LINK_COST="38.20777704254654" />
<Edge SPOT_SOURCE_ID="961869" SPOT_TARGET_ID="961873" LINK_COST="0.2895609647324684" />
</Track>
</AllTracks>
</Model>
</TrackMate>
Я хотел бы создать фрейм данныхсо всеми атрибутами ребер и родительским атрибутом TRACK_ID.Я могу легко создать фрейм данных со всеми атрибутами ребер с помощью этого:
edges = data.frame(t(data.frame(xml_attrs(xml_find_all(xmlDoc, xpath = paste0('/TrackMate/Model/AllTracks//Edge'))))))
row.names(edges) = NULL
Но тогда соответствующий идентификатор трека теряется.Я могу решить это с помощью цикла for, но это часто не «путь R».Мне было интересно, если есть более простое решение?(например, с запросом xpath).
Таким образом, конечным желаемым результатом будет этот фрейм данных: ![output data frame](https://i.stack.imgur.com/oZjue.png)
Редактировать: это подходит ближе, но затем отслеживаются узлы иКраевые узлы смешаны в списке.
xml_find_all(xmlDoc, xpath = paste0('/TrackMate/Model/AllTracks//Edge | /TrackMate/Model/AllTracks/Track'))