xml2とrvestを使ってRのXMLファイルを読み込んでいます。 XMLには、次の構造(ヘッダーは含まれていません)があります。私は<w:p></w:p>
の間のすべてのテキストを抽出したいが、最初にすべて<w:br/>
を空白に変換したい。R - xmlタグを空白で置き換えます。
<w:p><w:r><w:t>First bit of text</w:t></w:r><w:r><w:br/><w:t>Thank you!</w:t></w:r></w:p>
私は(完全に合法的なXMLで)次のコードを使用し
xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se wp14">
<w:body><w:p w:rsidR="00C87F35" w:rsidRDefault="008836BC" w:rsidP="008836BC"><w:pPr>
<w:pStyle w:val="Heading1"/></w:pPr>
<w:r><w:t>Example .</w:t></w:r>
<w:proofErr w:type="spellStart"/><w:r><w:t>docx</w:t></w:r><w:proofErr w:type="spellEnd"/>
<w:r><w:t xml:space="preserve"> file</w:t></w:r></w:p>
<w:p w:rsidR="008836BC" w:rsidRDefault="008836BC" w:rsidP="008836BC">
<w:r><w:t>This is an example .</w:t></w:r>
<w:proofErr w:type="spellStart"/>
<w:r><w:t>docx</w:t></w:r><w:proofErr w:type="spellEnd"/>
<w:r><w:t xml:space="preserve"> file included with the ‘</w:t></w:r>
<w:proofErr w:type="spellStart"/><w:r>
<w:t>readOffice</w:t></w:r>
<w:proofErr w:type="spellEnd"/>
<w:r><w:t>’ package to demonstrate functionality.</w:t></w:r></w:p>
<w:p w:rsidR="008836BC" w:rsidRPr="008836BC" w:rsidRDefault="008836BC" w:rsidP="008836BC">
<w:r><w:t>There is nothing exciting in this file!</w:t></w:r>
<w:r><w:br/><w:t>Thank you!</w:t></w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/></w:p>
<w:sectPr w:rsidR="008836BC" w:rsidRPr="008836BC">
<w:pgSz w:w="12240" w:h="15840"/>
<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
<w:cols w:space="720"/>
<w:docGrid w:linePitch="360"/></w:sectPr>
</w:body></w:document>'
xml2::read_xml(xml) %>%
rvest::xml_nodes('w\\:p') %>%
xml2::xml_text()
結果は以下のとおりです。
[1] "Example .docx file"
[2] "This is an example .docx file included with the \u0091readOffice\u0092 package to demonstrate functionality."
[3] "There is nothing exciting in this file!Thank you!"
が、改行<w:br/>
はちょうど隙間なく消えました最後の感嘆符と感謝の言葉。
実際のアプリケーションでは、文字列(read_xml
関数を使用)ではなくXMLのファイルを読み込んでいますので、私が探している単純なgsub
解決策ではありません。それが唯一の修正だからかもしれない。しかし、私が疑問に思っているのは、どのようにしてrvestとxml2を使って特定のタグを空白に変換できますか?
UPDATE
だから、それは別の答えでXPathとしてnormalize-space
機能を使用することが示唆されました。
paragraphs = xml2::read_xml(xml) %>%
rvest::xml_nodes('w\\:p')
purrr::map(paragraphs,function(x){
paste(xml2::xml_text(rvest::xml_nodes(x,xpath=".//text()[normalize-space()]")),collapse=" ")
})
テキストがそのように導入された余分なスペースが存在することになります<w:r>
と<w:t>
を含むすべてのタグに分割されているので、これはしかし、希望の結果が得られていません。最初の2つの要素には '.docx'にスペースがあり、2つ目には '' readOffice '"にスペースがあります。
[[1]]
[1] "Example . docx file"
[[2]]
[1] "This is an example . docx file included with the ‘ readOffice ’ package to demonstrate functionality."
[[3]]
[1] "There is nothing exciting in this file, but if you’re reading it, it means you installed my package! Thank you!"
私がスペースを知ってはcollapse=" "
の私の使用に起因しているが、私はcollapse=""
を使用する場合、結果は元のコードから変更されていません。これはもはや必要ないことがあり
可能な重複](http://stackoverflow.com/questions/42003932/adding-whitespace-to-text-elements) - あなたはそこに私のanserで述べたのと同じ機能を使用することができます。 rvestを使用したくない場合は、html_ * by xml_ *関数を置き換えてください。 – Rentrop
@ Floo0関数で使用するxpathは、指定されたタグだけでなく、すべてのタグのテキストを分割します。 – Mark