2011-12-19 18 views
1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <w:document xmlns:ve="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: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:wne="http://schemas.microsoft.com/office/word/2006/wordml"> 
    <w:body> 
     <w:customXml w:uri="Sample" w:element="note"> 
     <w:p w:rsidR="00B06944" w:rsidRDefault="0051608D" w:rsidP="000E0B9F"> 
      <w:customXml w:element="to"> 
      <w:r w:rsidR="000E0B9F" w:rsidRPr="00B84BAE"> 
       <w:rPr> 
       <w:b/> 
       <w:bCs/> 
       </w:rPr> 
       <w:t xml:space="preserve">Saran </w:t> 
      </w:r> 
      </w:customXml> 
     </w:body> 
    </w:document> 

でエラーを示します。r>を、このため 私が与える以下のコード私はノード<ワット読んでもらいたいと、以下のXMLを読み込むことはC#の

XmlDocument doc = new XmlDocument(); 
doc.Load("\\document.xml"); 
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable); 
XmlNode node = doc.SelectSingleNode("/w:body/w:customXml/w:r", namespaceManager); 

書いています:

この行に示されているエラーは、名前空間マネージャまたはXsltContextが必要です。このクエリには、接頭辞、変数、またはユーザー定義関数があります。

にはどうすれば

+0

[LINQ to XML](http://msdn.microsoft.com/en-us/library/bb387098.aspx)を使用していない理由は何ですか? – dtb

+0

いいえ私はxmlファイルを持っていますが、そのファイルから何をすればいいのですか?すべての値ノードを読み込むだけです。 – user1006544

答えて

4

wの意味についてnamespaceManagerに伝える必要があります。それは、このようなは、(ファイルから)冗長で聞こえますが、それは私があれば、意味はファイルのが同一であるため、クエリのためにしたい別名は、必ずしもソースからのものであることがない場合ですソース文書内のwのすべてのエイリアスをfooに置き換えます(同じ場合はfoo:xmlnsと定義している限り)。または、全体でエイリアスの代わりにxmlnsを使用することもできます。したがって

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable); 
namespaceManager.Add("w", 
    "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); 
XmlNode node = doc.SelectSingleNode("/w:body/w:customXml/w:r", namespaceManager); 

これはあなたのクエリは関係なく、ソースに使用される特定のエイリアスの、同様に成功することができます。

+0

あなたは動作していますが、問題はそれがノードを抽出していないことです。 – user1006544

+1

@ user1006544うーん、最初はそこに**はありません** w:R'、xmlは大文字と小文字を区別します。しかし、Jonは 'w:r'は' w:customXml'の子ではなく、 'w:body'はルートではありません(先頭の'/'はルートで始まることを意味します)。これは '/ w:document/w:body/w:customXml // w:r'ですか、単に' // w:customXml/w:r'を意味します。 –

1

あなたのXMLが有効でないXMLを読み取ることができます。あなたはクローズw:pタグを持っていません...

+0

実際にはそうではなく、質問からの抜けであることを示していることを示しています。 –

4

<w:p>タグに終了タグがなく、外側にも<w:customXml>が存在しないため、エラーが表示されません。それらが修正されたら、を正しく読み込みます。

正しいクエリを取得する問題があります。 Marcは答えとして答えましたが、個人的にはLINQのメソッドをXMLに代用していました。

var doc = XDocument.Load("test.xml"); 
XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 
var element = doc.Root.Element(w + "body") 
         .Element(w + "customXml") 
         .Element(w + "p") 
         .Element(w + "customXml") 
         .Element(w + "r"); 

これは要素を正しく検出します。名前空間以外にも元のXPathと同じではないことに注意してください。あなたのXMLを注意深く見てください。 アウター<w:customXml>エレメント内には<w:r>エレメントがありません。

関連する問題