XmlNode.SelectNode古怪(找不到两个非常相似的节点之一)

XmlNode.SelectNode古怪(找不到两个非常相似的节点之一),xml,vb.net,csv,xmlnode,Xml,Vb.net,Csv,Xmlnode,我管理的一个软件出现了一个bug,该软件用于根据用户选择创建物料清单。它使用一个大型xml文件,其中包含我们所有的零件号以及我们编写的规则,这些规则用于根据工程师所做的选择来选择这些零件号 我今天意识到,在一个非常具体的部分,大约一半的选择是有效的,而另一半是无效的。具体情况如下 我们根据相关规则的参数构建一个字符串,这些参数是根据用户选择设置的。此字符串将传递给XmlNode.SelectNode方法: mItem = mXMLData.SelectNodes(XPath) 下面是xpath

我管理的一个软件出现了一个bug,该软件用于根据用户选择创建物料清单。它使用一个大型xml文件,其中包含我们所有的零件号以及我们编写的规则,这些规则用于根据工程师所做的选择来选择这些零件号

我今天意识到,在一个非常具体的部分,大约一半的选择是有效的,而另一半是无效的。具体情况如下

我们根据相关规则的参数构建一个字符串,这些参数是根据用户选择设置的。此字符串将传递给XmlNode.SelectNode方法:

mItem = mXMLData.SelectNodes(XPath)
下面是xpath字符串的两个示例,一个查找节点,另一个不查找:

(A)

(B)

第一个字符串A将不返回任何节点,而第二个字符串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两个条目都在数据文件中。最奇怪的是,我能够用我们所有不同的轴承尺寸复制错误,它发现的轴承在数字的小数部分有一个两位数的分子,而没有发现的轴承有一个一位数的分子。这当然是一个巧合,因为它只是一根弦,根本不重要,但它适用于我们所有的尺寸

这就是我所知道的,我一直在和我们的一个开发人员(实际上编写了这个程序的大部分)讨论这个问题,我们都感到不知所措。如果有人有任何想法,请分享。此外,我试图在这里尽可能详细,但如果有任何额外的信息需要,我很乐意补充

谢谢

编辑:我终于找到了答案。

好的,这是一件非常奇怪的事情,最终与XmlNode.SelectNode函数无关

讨论中的XML文件是使用我们在这里从.csv文件集合创建的自定义工具编译的。当我们需要进行更改或类似的事情时,csv文件使数据更易于操作

正如我前面提到的,我们拥有的编译它的工具也会对文件进行加密。我们也有一个版本,将编译它没有加密,这是我刚才看到的

未加密查看时,有问题的行在“17/16”中有一个空格

在记事本中查看CSV文件时,只有一个空格

在excel中查看CSV文件时,它会显示两个空格,以便列匹配(excel格式,ugh)

当我最终浏览代码并查看它正在搜索的内存中的实际xml数据时,“17/16”有两个空格,因此它当然从来没有匹配过

最后,我不得不将excel中保存直径数据的CSV文件的列从数字格式更改为文本格式,保存并重新编译。如果我再次打开CSV文件,不做任何更改并保存它,它会再次将第二个空间放回那里

我已经把它修好了,程序正在运行


感谢大家的回复(特别是关于xpathvisualizer工具,非常方便)。这是一个让我沮丧的练习,它消耗了我一整天的时间。

我已经验证了一个最小的例子:

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#和.NET4.0中为我工作。我已经从示例文档中排除了
,因为我看不出它有什么相关性

编辑#1:


同样地,对于VB来说,这并不是说它应该有什么不同,也不是。我还注意到我在第一个示例中使用了
SelectSingleNode
,而不是
SelectNodes
。我纠正了这一点,它也按预期工作。

几乎可以肯定的是,你的帖子中没有打破这一点-你可以尝试XPath Visualizer工具(),我做到了,并且你的A+B XPath都在其中正常工作。果然,我使用了该工具,它发现两个XPath都很好。我唯一的另一个想法是,在编译实际使用的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" />
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']");
        }
    }
}