質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Q&A

解決済

1回答

15775閲覧

XmlNodeクラスのSelectSingleNodeメソッドの使い方について

TempProg

総合スコア12

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

0グッド

0クリップ

投稿2015/04/12 11:43

こんにちは。
現在RSSリーダのようなものをつくろうと頑張っています。

その中で、C#のXmlNodeクラスのSelectSingleNodeメソッドの使い方がわからないので質問いたします。

調べながら試行錯誤をして、次のようなコードを作成しました。

lang

1XmlDocument xml = new XmlDocument(); 2xml.Load("RSS_FILE"); 3XmlNode root = xml.DocumentElement; 4XmlNode channel = root.SelectSingleNode("/channel");

2行目で保存したRSS1.0のファイルを読み込み。
3行目でrootのタグ(=rdf:RDF)をとることに成功しました。
4行目でrdf:RDF内にあるchannelタグを取得したいのですが、このコードではnullが代入されてしまいます。

XPathの記述を間違えているのは明確ですが、どのように訂正すればいいかわかりません。

どなたかご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RSS1.0には「**http://purl.org/rss/1.0/**」という名前空間を持っており、SelectSingleNodeやSelectNodesを使って、ノードにアクセスする時は、**XmlNamespaceManager**を使用する必要があります。

使い方として、名前空間「 http://purl.org/rss/1.0/ 」をXmlNamespaceManagerに追加し、名前空間のプレフィックス名と関連付けます。

そして、SelectSingleNodeの引数にXPathとそのXmlNamespaceManagerを指定します。
その際、XPathのノード名の前に名前空間に関連付けたプレフィックス名を付けます。
(例: [プレフィックス名]:channel )

lang

1XmlDocument xml = new XmlDocument(); 2xml.Load( "RSS_FILE" ); 3 4XmlNamespaceManager xnm = new XmlNamespaceManager( xml.NameTable ); 5// 基底の名前空間(RSS1.0の場合、http://purl.org/rss/1.0/)には、適当なプレフィックス名と関連付けます(ここでは、「defns」とします)。 6xnm.AddNamespace( "defns", "http://purl.org/rss/1.0/" ); 7 8XmlNode root = xml.DocumentElement; 9XmlNode channel = root.SelectSingleNode( "defns:channel" );

また、XPathの式についてですが、
現在のノードから子ノードを指定する時には、/ は不要です。
( / から始めると、ドキュメント要素(RSS1.0の場合、「rdf:RDF」)から記述する必要がありますので)

[参考]

XmlNamespaceManager クラス (System.Xml) - MSDN
https://msdn.microsoft.com/ja-jp/library/system.xml.xmlnamespacemanager.aspx

[C#] XPathを使ってネームスペース(名前空間)が指定されているXMLファイルをパースする (XmlDocumentを利用)
http://www.ipentec.com/document/document.aspx?page=csharp-xml-namespace-parse-use-xpath-dom

投稿2015/04/13 02:51

nia_tn1012

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TempProg

2015/04/13 11:21

お陰で解決することが出来ました! 少々揚げ足を取るような形となってしまいますが、 root.SelectSingleNode( "defns:channel", xnm); にしないと動かないようです。 ともあれ、初歩的な問題にも詳しく解説してくださり、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問