2

私はXMLR でパッケージを使用しており、XML ツリーを文字列に「フラット化」し、ハンドラーを使用xmlParseしてさまざまな変換を行いたいと考えています (たとえば、とりわけ変換<code>...</code>) \code{...}

これを行う「適切な」方法について完全には確信が持てず、ガイダンスを求めています。

以下の例では、タグのハンドラーを使用してstringcodeを返し、タグのハンドラーを使用してさまざまなビットをすべて貼り付ける1 つの方法を考えました。 \code{contents}p

library(XML)
code.xml <- '<p>This is some <code>inline code</code>.</p>'
handlers <- list()
handlers$code <- function (node) {
    paste0('\\code{', xmlValue(node), '}')
}
# paste together the bits of text
handlers$p <- function(node) {
    bits <- sapply(xmlChildren(node), function (ch) {
        if (is.character(ch)) return(ch)
        xmlValue(ch)
    })
    paste(bits, collapse='')
}


xmlRoot(xmlTreeParse(code.xml, asText=T, asTree=T,
                     handlers=handlers, trim=F,
                     useInternalNodes=F))

# "This is some \\code{inline code}."

ただし、一部の要素では祖先情報(親ノードなど) が必要なため、これは実行可能ではありません。したがって、 への呼び出しでxmlParse使用する必要があります。useInternalNodes=TRUExmlTreeParse

asTree=Tただし、フラット化された文字列を呼び出しから戻すために呼び出しを設定したいのですが、これによりエラーが発生します。

xmlTreeParse(code.xml, asText=T, asTree=T,
             handlers=handlers, trim=F,
             useInternalNodes=T)

# Error in class(ans) = oldClass(class(ans)) :
#  attempt to set an attribute on NULL

XMLInternalNodesこれは、ハンドラーが文字列を返すためではなく、内部で何か問題が発生しているためだと確信しています(?)。

ユーザー定義の変換を特定のタグに適用して、XML ツリーを文字列にフラット化する別の方法はありますか (そして、変換しようとしているものの親ノードが何であるかを知ることができなければなりません)。

(ちなみに、今の私の方法が「間違っている」ことは十分承知していますが、どのようにすれば<code></code>よいかわかりません。さまざまな変換をしたい場合は\code{}、 XML を文字列に変換する場合、XML 解析ツリーを使用する必要があります (たとえば、正規表現ではなく) が、これは正しい方法ではないようです. 1 つの目的は、xmlTreeParse実際にはノードを平坦化して収集することではありません!)。

4

0 に答える 0