sxd-xpathクレートを使用してXMLをクエリしようとしていますが、ノードセットの処理方法がわからないようです。
クレートと使用
extern crate sxd_document;
extern crate sxd_xpath;
use sxd_document::parser;
use sxd_xpath::{Factory, Context, Value};
実際のコード
let package = parser::parse("<feed><title>hest</title><title>hest2</title><title>hest3</title><title>hest4</title></feed>").expect("failed to parse XML");
let document = package.as_document();
let factory = Factory::new();
let xpath = factory.build("/feed/title").expect("Could not compile XPath");
let xpath = xpath.expect("No XPath was compiled");
let context = Context::new();
let value = xpath.evaluate(&context, document.root()).expect("XPath evaluation failed");
すべてのノードを繰り返し処理しての値を出力したいのですが<title>
、その方法がわかりません。
私はRustの世界ではかなり新しいので、C#とPythonを使用しています。
XPath::evaluate
を返しますValue
:
fn evaluate<'d, N>(
&self,
context: &Context<'d>,
node: N,
) -> Result<Value<'d>, ExecutionError>
where
N: Into<Node<'d>>,
AValue
は、XPathの可能な値(数値、ブール値、文字列、またはノードセット)の列挙です。あなたの場合、ノードセットに関心があるので、そのバリアントに一致させる必要があります。
if let Value::Nodeset(nodes) = value {
// ...
}
Nodeset
を実装IntoIterator
しているので、for
ループで使用できます。
for node in nodes {
// ...
}
生成される各値はになりますNode
。これは、XMLドキュメント内のさまざまなタイプのノードすべての列挙です。あなたはに興味がありElement
ます。場合は、すべてあなたが気には要素の文字列値では、使用することができますNode::string_value
。これにより、それぞれが独自のテキストを持つ複数の子ノードの複雑さが隠されます。
println!("{}", node.string_value());
すべてをまとめる:
if let Value::Nodeset(nodes) = value {
for node in nodes {
println!("{}", node.string_value());
}
}
AにNodeset
は保証された順序がないため、ドキュメント内のノードの順序を指定する場合は、次のように呼び出すことができますNodeset::document_order
。
if let Value::Nodeset(nodes) = value {
for node in nodes.document_order() {
println!("{}", node.string_value());
}
}
免責事項:私はSXD-DocumentとSXD-XPathの作成者です
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加