在LINQ to XML的条款中的位置

时间:2010-11-08 15:27:08

标签: c# xml linq linq-to-xml

以下代码应返回过滤器中的所有条形码。但它似乎只在第一个新记录中超出过滤器。

xml包含5个新记录,条形码子元素范围为1-5。如果过滤器包含1,3和4,则返回1,如果过滤器包含2,3和4,则返回no记录。

当前设置(rpa.XMLData.Elements(“NEWFILE”)。Elements(“NEWRECORD”))返回5行。我已经尝试过如果我将其更改为单行回来会发生什么(rpa.XMLData.Elements(“NEWFILE”))但是这样做会给我回复1结果是第一次击中,忽略3和4。 / p>

有没有办法更改此LINQ语句以实际查看所有条形码?

编辑:信息来自测试atm很抱歉,如果它看起来有点奇怪。我在xml和过滤器上添加了信息。

另外,如果

,我在问题上找到了额外的东西

过滤器包含1,2,3可行。 过滤器包含1,2,4,它将返回1,而不是4。

一旦它找不到解决方案,它似乎就会破裂。

String string2Stream = String.Concat("2", Environment.NewLine, "3", Environment.NewLine, "4", Environment.NewLine, "End");
        Stream reader = new MemoryStream(ASCIIEncoding.Default.GetBytes(string2Stream));
   StreamReader read = new StreamReader( reader );
   var filter = Enumerable.Where(StreamReaderToSeq(read), x => { int temp; return int.TryParse(x, out temp); });


   var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
               where filter.Contains(p.Element("BAR_CODE").Value)
               select new { p.Element("BAR_CODE").Value };   

在xml下面我删除了很多不应该相关的额外内容。

<?xml version=\"1.0\"?>
<NEWFILE>

<NEWRECORD num=\"1\"><MAILSORT></MAILSORT><BAR_CODE>1</BAR_CODE>
 </NEWRECORD> 

<NEWRECORD num=\"2\"><MAILSORT></MAILSORT><BAR_CODE>2</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"3\"><MAILSORT></MAILSORT><BAR_CODE>3</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"4\"><MAILSORT></MAILSORT><BAR_CODE>4</BAR_CODE>  
</NEWRECORD>

<NEWRECORD num=\"5\"><MAILSORT></MAILSORT><BAR_CODE>5</BAR_CODE>  
</NEWRECORD>

</NEWFILE>

2 个答案:

答案 0 :(得分:1)

var filter = new List<string> {"1", "2", "4"};

var query = from p in barcode.Descendants("BAR_CODE")
            where filter.Contains(p.Value)
            select p.Value;

我不知道你在哪里使用你创建的过滤器,但我认为这是一个非常安全的查询。它很方便,因为即使BAR_CODE为空它也能正常工作。

答案 1 :(得分:0)

作为替代答案,This显示了如何在没有包含但保持流的情况下使其工作。

转换为我的代码也有效。

但是如果一个失败,如果你用一个List替换了流,或者用一个JOIN替换了包含,那么为什么包含失败呢?有人知道答案吗?

      var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
                join f in filter on
                    p.Element("BAR_CODE").Value equals f.ToString()                    
                select p; 

       var projectsMemberWorkedOn =
                    rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD")
                    .Join(filter, p => p.Element("BAR_CODE").Value, f => f.ToString(), 
                        ( p, f ) => new { p, f } ) 
                        .Select(@t => @t.p );