我正在下載很多 XML 檔案,我想從中提取一些值(每個檔案中的值相同)。這些檔案都以相同的方式決議(我稍微縮短了檔案):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bilans version="1.0" xmlns="fr:inpi:odrncs:bilansSaisisXML">
<bilan>
<identite>
<siren>03827494129</siren>
<code>5610A</code>
<code_motif>00</code_motif>
<denomination><![CDATA[blabla]]></denomination>
<adresse><![CDATA[13100 Aix-en-Provence]]></adresse>
</identite>
<detail>
<page numero="01">
<liasse code="AH" m1="000000000550366" m3="000000000550366" m4="000000000550366"/>
<liasse code="CF" m1="000000000061757" m3="000000000061757" m4="000000000063065"/>
</page>
<page numero="02">
<liasse code="DA" m1="000000000007622" m2="000000000007622"/>
<liasse code="DL" m1="000000000322767" m2="000000000317800"/>
<liasse code="DV" m1="000000000015103"/>
<liasse code="DX" m1="000000000090125" m2="000000000047110"/>
</page>
</detail>
</bilan>
</bilans>
我感興趣的值在 中identite,但也主要在屬性引數值中(如果我得到正確的 XML 術語)。例如,我想提取 liasse code = "CF" 的“m3”值,這意味著我既要按屬性過濾,又要提取也包含在此特定屬性中的值。
最大的限制是我要提取很多這些 xml 檔案(實際上代表公司的年度資產負債表),所以我不確定在 R 檔案中提取所有 xml 檔案是否對記憶體友好,然后篩選。
我瀏覽的資源集中在提取特定屬性的值,這是一個常見的操作,但是按屬性過濾和提取相同的屬性值是我在 R 中沒有找到的。
uj5u.com熱心網友回復:
只是一個XPath然后xml_attr:
xmlfile %>%
xml_ns_strip() %>%
xml_find_all(xpath = "//liasse[@code='CF']") %>%
xml_attr("m3")
uj5u.com熱心網友回復:
考慮遍歷所有<bilan>節點并提取底層后代,特別是<identite>節點和特定liasse屬性。下面展示了如何決議默認命名空間下的元素,因為 XML 包含:xmlns="fr:inpi:odrncs:bilansSaisisXML".
library(xml2)
library(dplyr)
# LOAD XML
doc <- xml2::read_xml("Input.xml")
# USE TEMP fr PREFIX FOR DEFAULT NAMESPACE
nmsp <- c(fr = "fr:inpi:odrncs:bilansSaisisXML")
# RETRIEVE ALL bilan NODES
bilans <- xml_find_all(doc, "//fr:bilan", ns=nmsp)
# ITERATE THROUGH ALL bilan DESCENDANTS
df_list <- lapply(bilans, function(bilan) {
# RETRIEVE identite NODES
ch_recs <- xml_find_all(bilan, "fr:identite/*", ns=nmsp)
# BIND NODE NAMES AND TEXT TO DATA FRAME AND ADD m3 COLUMN
data.frame(rbind(setNames(
c(xml2::xml_text(ch_recs)),
c(xml2::xml_name(ch_recs))
))) %>% mutate(
m3 = xml_text(xml_find_first(
bilan, "fr:detail/fr:page/fr:liasse[@code='CF']/@m3", ns=nmsp
))
)
})
# BIND ALL LIST OF DFs TO SINGLE DF
bilan_df <- dplyr::bind_rows(df_list)
輸出
str(bilan_df)
# 'data.frame': 1 obs. of 6 variables:
# $ siren : chr "03827494129"
# $ code : chr "5610A"
# $ code_motif : chr "00"
# $ denomination: chr "blabla"
# $ adresse : chr "13100 Aix-en-Provence"
# $ m3 : chr "000000000061757"
bilan_df
# siren code code_motif denomination adresse m3
# 1 03827494129 5610A 00 blabla 13100 Aix-en-Provence 000000000061757
上面將決議<bilan>單個 XML 檔案中的所有節點。如果您需要遍歷許多 XML 檔案,請在上面的函式中運行,該函式接收檔案名作為輸入引數。然后在 XML 檔案中迭代呼叫函式。你可以做一個最終的檔案級別bind_rows:
parse_bilan_data <- function(xml_file) {
# LOAD XML
doc <- xml2::read_xml(xml_file)
...
# BIND ALL LIST OF DFs TO SINGLE DF
bilan_df <- dplyr::bind_rows(df_list) %>% mutate(source=xml_file)
}
xml_files <- list.files(path="/path/to/XML/files", pattern=".xml")
all_bilan_df <- dplyr::bind_rows(
lapply(xml_files, parse_bilan_data)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515289.html
標籤:rxml
上一篇:R:線性模型的柵格預測問題
下一篇:If陳述句回傳數字而不是變數名
