2009-07-08 14 views
2

私はExcelシートのためのOpen XMLドキュメントフォーマットに取り組んでいます。なぜXPath式はC#で結果を返さないが、C#の外で行うのはなぜですか?

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]"); 

これはすべての行を論理式で返しますが、何も返しません。 Oxygen Editorの同じxmlは、同じxpath式を適用すると、それらのすべてを返します。

コンテンツが同じであることを保証するためにWorksheetXml inner xmlをコピーしています... C#が期待通りに動作しない理由を知っていますか?


EDIT:名前空間の問題、私はこれを入れている

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace(string.Empty, @"http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]", manager); 

、それは動作しませんでした、私はそれが名前空間の問題ではないと思います。

+0

btw、 "// c [f]"はより簡単になります; -p –

答えて

3

Oxygen Editorが名前空間を異なる方法で扱う可能性はありますか?私の推測では、c要素は名前空間にありますが、指定していません。

サンプルコードについてはthis very similar questionを参照してください。問題がない場合は、詳細を投稿してください。

編集:あなたがまだ投稿したコードは、XPathで名前空間を使用していません。これを試してみてください:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace("n", 
    "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", 
    "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes("//n:c[child::n:f]", manager); 

は(私は cf要素がであることを意味する名前空間か知りません - 適切に調整してください。)

(リテラル逐語的文字列を使用する必要がないことに注意してください文字列が1行にあります)

+0

c要素はデフォルト名前空間にあります。私はnamespacemgrを追加しましたが、それでも何も返されません=/ –

+0

そして、これはデフォルトの名前空間ですか?私はあなたが空の名前空間を意味しないと確信しています。あなたは本質的な関係を意味しますか?私の編集を参照してください。 –

+0

私はXPathなしでこの問題を解決しました。なぜなら、それは機能していなかったし、先週コードを配布しなければならなかったからです。 xを作成しても空の名前空間でもありますが、cはちょうど ...です--cをn:cとして扱うと助かりますか? –

0

XPath式のノードにOpenXML名前空間を指定していません。すべての在庫私が知っている.NET XPath APIは、ドキュメントコンテキストからネームスペースを継承しないため、明示的に指定せずにXPath式で接頭辞を使用しないと、空のネームスペースとして扱われます。

これがXmlNode.SelectNodeの呼び出しであると仮定すると、2番目の引数がXmlNamespaceManagerである2引数のオーバーロードが必要です。

+0

私はパラメータとしてマネージャを渡して変更しましたが、それでも動作しません。/ –

+1

XPathでは、空の名前空間に_always_というURIがないため、 XmlNamespaceManagerで何をするかにかかわらず。 http://www.w3を参照してください。ノードテストのQNameは、式コンテキストからの名前空間宣言を使用して展開名に展開されます。 ... xmlnsで宣言されたデフォルトの名前空間は使用されません.QNameに接頭辞がない場合、名前空間URIはnullです(これは属性名が展開されるのと同じ方法です)。 XPathで接頭辞を使用して機能させる必要があります。 –

関連する問題