2011-11-15 24 views
2

名前属性値でノードを検索しようとしています。ここでXPathを使用して名前属性値のノードを検索します

は、XML文書のサンプルです:ここで

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<!DOCTYPE kfx:XMLRELEASE SYSTEM "K000A004.dtd"> 
<kfx:XMLRELEASE xmlns:kfx="http://www.kofax.com/dtd/"> 
    <kfx:KOFAXXML> 
    <kfx:BATCHCLASS ID="00000008" NAME="CertficateOfLiability"> 
     <kfx:DOCUMENTS> 
     <kfx:DOCUMENT DOCID="00000006" DOCUMENTCLASSNAME="COL"> 
      <kfx:DOCUMENTDATA> 
      <kfx:DOCUMENTFIELD NAME="Producer Name" VALUE="Howalt+McDowell Insurance" /> 
      ... 
      .... 

は私が試み式です:

var xml = XDocument.Load(new StreamReader("C:\\Users\\Matthew_cox\\Documents\\test.xml")); 
XNamespace ns = "http://www.kofax.com/dtd/"; 
XmlNamespaceManager nsm = new XmlNamespaceManager(xml.CreateNavigator().NameTable); 
nsm.AddNamespace("kfx", ns.NamespaceName); 

var docs = xml.Descendants(ns + "DOCUMENT"); 
foreach(var doc in docs) 
{ 
     doc.XPathSelectElement("/DOCUMENTDATA/DOCUMENTFIELD/[@name='Producer Name']", nsm); //this line produces this exception: Expression must evaluate to a node-set. 
} 

答えて

1

XMLは大文字と小文字が区別されます。提供されたXMLでkfx:DOCUMENTFIELDにはNAME属性があります。また、XPathには名前空間への参照がありません。私は間違った二つのことを見

kfx:DOCUMENTDATA/kfx:DOCUMENTFIELD[@NAME = 'Producer Name'] 
+0

私はあなたが注意されますようXmlNamespaceMangerオブジェクトを提供したが上記。私はそれが名前空間の部分を扱うと仮定しましたが、賢明にはそうではありません。しかし、あなたのバージョンでも、私のコンパイラは結果セットなどを返すような式を生成していない場合と同じ例外をスローします。 –

+0

@MatthewCox、私は私の答えを更新しました。 –

+0

Xパスに接頭辞を含めるとします。SelectNode( "kfx:SomeNodeName/kfx:SomeChildName"、SomeNameSpaceManager) –

1

は、このXPathを試してみてください。

まず「/」で始まるものを選択しています。これはドキュメントのルートから選択するため、先頭のスラッシュを取り除きます。

第2に、表現は少し甘いです。私はDOCUMENTFIELDに直接条件を含めるでしょう。 (ノード軸上の式が実際に何かを意味するのではないかどうかは確かではありませんが... .../node()[..]またはおそらく.../* [..]と同じです。 ?])キリル・ノートとして

、あなたはまた、ケーシングと名前空間を見なければならないが、これは式がセットノードAに評価していない不満のC#を解決する必要があります。

kfx:DOCUMENTDATA/kfx:DOCUMENTFIELD[@NAME = 'Producer Name'] 
+0

正しい方向への一歩(これ以上の例外はありません)。しかし、結果が出ないので、私のクエリは間違っているようです。問題に関する考えは? –

+0

私は個人的にはネームスペースマネージャを気にしません。それを取り除こうとしましたか?ああ、ちょうど私がtypet btwを作ったことに気付きました。最初の名前空間はkfxではなく、おそらくそれです。それがうまくいかない場合は、すべての名前空間をどこからでも取り除き(source、ns-manager、およびquery)、それらを段階的に追加してください。それは最終的に私のためにそれを修正します。 –

関連する問題