【问题标题】:c# xml multiple elementsc#xml多个元素
【发布时间】:2011-07-08 00:10:44
【问题描述】:

这是我检索这些多个元素的 2 次尝试,第一次只选择第一个框和第一个文本元素

第二个检索所有,但它们不是单独的变量--

var xmlDoc = document.Root.Elements("Page")
                          .Select(element => new
                          {
                             Box = (string)element.Element("Box"),
                             Text = (string)element.Element("Text"),
                          }).ToList();


var xmlDoc = document.Root.Descendants("Page")
                          .Elements()
                          .Select(x => x.Value)
                          .ToList();

xml 示例:

<?xml version="1.0" standalone="yes"?>
<PrintJob>
<Page>
<Box>0000,0000,0190,0135</Box>
<Box>0050,0100,0190,0135</Box>
<Text>0000,0000,"ABCdef123456"</Text>
<Text>0000,0000,"ABCdef123456"</Text>
<Text>0000,0050,"ABCdef123456"</Text>
<Text>0000,0050,"ABCdef123456"</Text>
</Page>
</PrintJob>

循环检索元素:

foreach (var x in xmlDoc)
{
   //result += "box: " + x.Box + "\n";
   //result += "text: " + x.Text + "\n";
   result += "x: " + x + "\n";
}

我如何得到这样的结果:

box: 0000,0000,0190,0135
box: 0050,0100,0190,0135
text: 0000,0000,"ABCdef123456"
text: 0000,0000,"ABCdef123456"
text: 0000,0050,"ABCdef123456"
text: 0000,0050,"ABCdef123456"

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    你在寻找这样的东西吗?

    var page = document.Element("PrintJob")
                       .Element("Page");
    
    var boxes = page.Elements("Box")
                    .Select(x => (string)x)
                    .ToList();
    
    var texts = page.Elements("Text")
                    .Select(x => (string)x)
                    .ToList();
    
    foreach (var box in boxes)
        Console.WriteLine("Box: " + box);
    foreach (var text in texts)
        Console.WriteLine("Text: " + text);
    

    输出:

    框:0000,0000,0190,0135 邮箱:0050,0100,0190,0135 文本:0000,0000,"ABCdef123456" 文本:0000,0000,"ABCdef123456" 文本:0000,0050,"ABCdef123456" 文本:0000,0050,"ABCdef123456"
    var items = document.Element("PrintJob")
                        .Element("Page")
                        .Elements()
                        .Select(x => x.Name.LocalName + ": " + (string)x)
                        .ToList();
    
    foreach (var item in items)
        Console.WriteLine(item);
    

    输出:

    框:0000,0000,0190,0135 邮箱:0050,0100,0190,0135 文本:0000,0000,"ABCdef123456" 文本:0000,0000,"ABCdef123456" 文本:0000,0050,"ABCdef123456" 文本:0000,0050,"ABCdef123456"
    var items = document.Element("PrintJob")
                        .Element("Page")
                        .Elements()
                        .Select(x => new
                                     {
                                         Box  = (x.Name.LocalName == "Box")
                                              ? (string)x
                                              : null,
                                         Text = (x.Name.LocalName == "Text")
                                              ? (string)x
                                              : null
                                     })
                        .ToList();
    
    foreach (var item in items)
        Console.WriteLine("Box: " + item.Box + " Text: " + item.Text);
    

    输出:

    框:0000,0000,0190,0135 文本: 框:0050,0100,0190,0135 文本: 框:文本:0000,0000,"ABCdef123456" 框:文本:0000,0000,"ABCdef123456" 方框:文本:0000,0050,"ABCdef123456" 方框:文本:0000,0050,"ABCdef123456"

    【讨论】:

    • 看起来不错,可以只用一个列表来完成吗,就像我的第一个示例的变体一样? -- 也许这不是要走的路,但要努力理解这一点--
    • 从你的第二个答案,你怎么办:foreach(var item in items) Console.WriteLine("Box: " + item.Box + "Text: " + item.Text )
    • @Scott:这个输出应该是什么?
    • 输出看起来一样,只需要最终挑选出单独的框/文本元素,我喜欢第二个例子--
    • @Scott:添加了另一个示例。您可能应该使用自定义类而不是匿名类型,例如,abstract class PageItem { } class Box : PageItem { } class Text : PageItem { }
    【解决方案2】:
    var xmlDoc = document.Root.Descendants("Page")
                              .Elements();
    foreach(var x in xmlDoc)
    {
        Console.WriteLine(x.Name + ": " + x.Value);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多