2012-02-16 9 views
0

ユーザーの選択に基づいて部品表を作成するために使用するソフトウェアのバグがありました。エンジニアが選択した部品に基づいてこれらの部品番号を選択するために使用されているルールだけでなく、すべての部品番号を含む大きなXMLファイルで動作します。XmlNode.SelectNode奇妙(2つの非常によく似たノードの1つを見つけられません)

1つの非常に特定の部分では、選択範囲の約半分が機能し、残りの半分は機能しないことが今日気付きました。ここにその詳細があります。

問題のルールのパラメータに基づいて文字列を作成します。これらのパラメータは、ユーザーの選択に基づいて設定されています。この文字列はXmlNode.SelectNodeメソッドに渡される:

A)

/Root/Items/Item[@DropDownDescription='Ball Bearing' and @Diameter='1 7/16'] 
:ここ

mItem = mXMLData.SelectNodes(XPath) 

はないXPath文字列、ノードを見つけ1つずつの2つの例であります

B)

/Root/Items/Item[@DropDownDescription='Ball Bearing' and @Diameter='1 11/16'] 

最初の文字列、Aは、2番目の文字列、B、あろうが、任意のノードが返されません。ここでは、それらの部品番号が含まれている私たちのXMLデータベースのセグメントされています。

<Item Key="FanBearing.1.3" ItemNumber="30400074" DropDownDescription="Ball Bearing" Diameter="1 7/16" /> 
<Item Key="FanBearing.1.4" ItemNumber="30400075" DropDownDescription="Ball Bearing" Diameter="1 11/16" /> 

は(私はここで読むためにそれらを短くし、より簡単にするために、これらのエントリからいくつかの意味のないデータを削除どちらの場合も、データが削除さと同一の近くにあります、など)の違いのみであること、コスト/ウェイト、と

あなたが見ることができるように、両方のエントリは、AとBは、データファイルです。最も奇妙な部分は、さまざまなベアリングサイズのすべてでエラーを再現できたことです。見つかったものは、数値の端数部分に2桁の分子があります。 findは1桁の分子を持つ。もちろん、それは単なる文字列であり、全く問題ではないので、当然のことながら偶然でなければなりませんが、私たちが持つすべてのサイズについて真実を保っています。私が持っているすべてです

は、私たちの他の開発者の一人(実際にこのプログラムの大部分を書いたもの)で、この上に行くされてきたし、我々は損失の両方です。誰かが思考を持っているならば、分かち合ってください。また、私がここでできるほど徹底しようとしましたが、追加情報が必要な場合は追加してもよろしいです。

ありがとうございました。

編集:私は最終的に、それを考え出しました。

これは最終的にXmlNode.SelectNode関数に関係しない非常に奇妙なことでした。

ここで作成したカスタムツールを使用して、問題のXMLファイルを.csvファイルのコレクションからコンパイルします。 csvファイルを使用すると、そのような性質の変更や処理が必要な場合に、データを簡単に操作できます。

前述のように、私たちがコンパイルしたツールもファイルを暗号化します。また、暗号化せずにコンパイルするバージョンもあります。以前のバージョンではそれを見ていました。暗号化されていない見た場合

は、問題のある行が「1 7/16」CSVファイルをメモ帳で表示された

に1つのスペースを持っていた、1つのスペースがありました。

CSVファイルをExcelで表示したときに、2つのスペースで表示され、列が一致するようになりました(書式設定には優れています)。

私は最終的にコードを踏んで、それが検索していたメモリ内の実際のXMLデータを見たところ、 '1 7/16'には2つのスペースがあったので、決して一致しませんでした。

最終的には、直径データを数値形式からテキスト形式にして保存して再コンパイルするExcelのCSVファイルの列を変更する必要がありました。 CSVファイルをもう一度開いて何も変更せずに保存した場合、もう一度2番目のスペースがそこに戻されます。

私はそれを解決しましたが、プログラムは動作しています。

皆さん、ありがとうございます(特にxpathvisualizerツールについては、非常に便利です)。これは私の一日を燃やした不満の練習でした。

+0

XPath Visualizer Tool(http://xpathvisualizer.codeplex.com/)を試してみると、A + Bの両方のXPathが正しく動作することが判明しました。 –

+0

確かに、私はそのツールを使用して、両方のxpathsがうまく見つかりました。私の唯一の他の考え方は、使用されている実際のXMLファイルは、コンパイルするときに暗号化され、実際のプログラムで暗号化されていないということです。 – Anthony

+0

xpath APIが '/'に遭遇したときに除算を実行しようとしている可能性はありますか? –

答えて

0

私は、最小限の例ことを確認しました:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var doc = new XmlDocument(); 
      doc.Load(@"..\..\XMLFile1.xml"); 

      var x1 = doc.SelectSingleNode("Items/Item[@DropDownDescription='Ball Bearing' and @Diameter='1 7/16']"); 
      var x2 = doc.SelectSingleNode("Items/Item[@DropDownDescription='Ball Bearing' and @Diameter='1 11/16']"); 
     } 
    } 
} 

が... C#と.NET 4.0に私のために動作します。どのように関連性があるのか​​わからないので、私はサンプル文書から<Root>を除外しました。

編集#1:VBのために同様に

、それはどんな違いをしなければならないということ、そしてそれはしていません。私はまた、最初の例でSelectSingleNodeを使用し、SelectNodesを使用しなかったことに気付きました。私はこれを訂正し、期待通りに機能しました。

関連する問題