C# 打印出嵌套的匿名类型

C# 打印出嵌套的匿名类型,c#,xml,linq,C#,Xml,Linq,我有一个具有以下结构的xml文件 <Product ID="Sample A" UserTypeID="TYPE_PRD_RANGE"> <MultiValues> <Value> <Value AttributeId = "Att_1">Value1</Value> </MultiValues> <Values AttributeId = "Att_2"

我有一个具有以下结构的xml文件

 <Product ID="Sample A" UserTypeID="TYPE_PRD_RANGE">
      <MultiValues>
      <Value>
       <Value AttributeId = "Att_1">Value1</Value>
      </MultiValues>
      <Values AttributeId = "Att_2">
        <Value AttributeId = "Att_3">Value1</Value>
        <Value AttributeId = "Att_4">Value2</Value>
        <Value AttributeId = "Att_5">Value3</Value>
        <Value AttributeId = "Att_6">Value4</Value>
      </Values>
      <Product ID="Sample A_1" UserTypeID="SUB_RANGE">
        <Values AttributeId = "Att_2_5">
          <Value AttributeId = "Att_2_4">Value1</Value>
          <Value AttributeId = "Att_2_3">Value2</Value>
          <Value AttributeId = "Att_2_1">Value3</Value>
          <Value AttributeId = "Att_2_2">Value4</Value>
        </Values>
      </Product>
      <Product ID="Sample A_1_1" UserTypeID="ITEM">
        <Values AttributeId = "12345">
          <Value AttributeId = "Att_2_1_1">Value1</Value>
          <Value AttributeId = "Att_2_2_1">Value2</Value>
          <Value AttributeId = "Att_2_3_1">Value3</Value>
          <Value AttributeId = "Att_2_4_1">Value4</Value>
        </Values>
      </Product>    
   </Product>
我正试图以以下格式将查询结果写入控制台或文本文件

"range_Product ID" ,"range_Attribute 1.Value", 
    "subrange Product_ID", "subrange_Attribute2.Value" 
        Item Product_ID,  "item_Attribute_1.Value" ,"item_Attribute_2.Value"
        Item Product_ID,  "item_Attribute_1.Value" ,"item_Attribute_2.Value"
目前我可以做类似的事情:

"range_Product ID" ,"range_Attribute 1.Value", 
    "subrange Product_ID", "subrange_Attribute2.Value" 
    "subrange Product_ID", "subrange_Attribute2.Value" 
        Item Product_ID,  "item_Attribute_1.Value" ,"item_Attribute_2.Value"
        Item Product_ID,  "item_Attribute_1.Value" ,"item_Attribute_2.Value"
但是我想先打印出每个子范围下的每个项目。我是不是找错人了,或者这有一点点可能?我曾有过将XML反序列化到POCO中的建议,但没有人能说出我所寻找的是否可行

编辑:所需输出样本。

"Sample A"  "Value1"
  "Sample A_1"  "Value3"
     Sample A_1_1  "Value 1" "Value 2" 
     Sample A_1_2    "Value1" "Value2" 

这样转换XML文本输出是完全可行的。几点建议

首先,我不认为在这里使用匿名类型有什么好处。在IMO中,定义一个顶级类来吸收所有必要的信息,这将使您更容易对正在处理的数据的形状进行推理。但这并不意味着您需要序列化;您仍然可以从XML手动填充对象,这可能会减少工作量,并且可以更好地定义端点形状

然后,您可以将一个方法与类相关联,该类以您认为合适的方式将其数据输出到控制台(甚至只需重写
ToString()

还可以查看扩展方法
xpatheevaluate
。它将使XML查询更具可读性和简洁性

编辑:由于您提供了所需内容的示例,这里有一个解决方案

public void OutputProductElement( XElement inElem, int inIndentLevel )
{
    string theIndentation = new string( Enumerable.Repeat( '\t', inIndentLevel ).ToArray());

    var theValueElements = inElem.XPathSelectElements( "MultiValues/Value" ).Concat(
        inElem.XPathSelectElements( "Values/Value" )
        );

    string theValueList = string.Join( " ", theValueElements.Select( elem => @"""" + elem.Value + @"""" ) );

    Console.Out.WriteLine( theIndentation + @"""" + (string)inElem.Attribute("ID") + @""" " + theValueList  );

    //no print all children elemnts
    inElem.Elements( "Product" ).ToList().ForEach( elem => OutputProductElement( elem, inIndentLevel + 1 ) );
}
以下是输出:

"Sample A" "Value1" "Value1" "Value2" "Value3" "Value4"
  "Sample A_1" "Value1" "Value2" "Value3" "Value4"
  "Sample A_1_1" "Value1" "Value2" "Value3" "Value4"

希望我没有为你做功课:)

1)你的XML没有解析:
值>
应该是
,第二个
应该是
。你能确认并更新你的问题吗?>2)我对你想要什么有点困惑,你能给出你问题中特定XML示例的所需输出吗?@dbc。哦,你说得对。我用示例输出进行编辑..哈哈,刚刚看到你的编辑。这不是家庭作业。我正在尝试为Tekla Warehouse创建一些配置文件,但目前进展缓慢。你能不能扩展一下“从XML手动填充对象”我的意思是手动填充XML数据的类(使用c#代码和linq)在我看来和反序列化一样简单。但是如果你只是把它作为一个字符串输出到某个地方,把所有的数据都塞进一个类中,那就太过分了,所以你只需要编写一个像上面那样的递归函数(如果我能捕捉到你想要的输出)。只需传入XDocument的
根目录
,0表示缩进级别。希望有帮助。
"Sample A" "Value1" "Value1" "Value2" "Value3" "Value4"
  "Sample A_1" "Value1" "Value2" "Value3" "Value4"
  "Sample A_1_1" "Value1" "Value2" "Value3" "Value4"