C# foreach循环存在问题,无法以XML文件的形式获得正确的输出

C# foreach循环存在问题,无法以XML文件的形式获得正确的输出,c#,xml,linq,enterprise-architect,C#,Xml,Linq,Enterprise Architect,我目前正在与企业架构师(EA)合作,我正在编写一个小插件,从模型图中提取属性和AttributeValue,并将其提取到XML文件中。如何使用EA-API没有问题,但由于我对C#相当陌生,我对C#实现有问题: 首先我发布代码,然后是一段输出文件,然后是一个示例,说明我想要什么样的输出。所以至少这个问题有一个结构,比我的代码好;) 输出如下所示: <Application01> <App01 Name="App01" /> </Application01>&

我目前正在与企业架构师(EA)合作,我正在编写一个小插件,从模型图中提取属性和AttributeValue,并将其提取到XML文件中。如何使用EA-API没有问题,但由于我对C#相当陌生,我对C#实现有问题:

首先我发布代码,然后是一段输出文件,然后是一个示例,说明我想要什么样的输出。所以至少这个问题有一个结构,比我的代码好;)

输出如下所示:

<Application01>
  <App01 Name="App01" />
</Application01><Application01>
  <App01 ApplicationDomain="xyz" />
</Application01><Application01>
  <App01 AbstractionLevel="" />
</Application01><Application01>
  <App01_Communication Type="CAN" />
</Application01><Application01> 

它是这样进行的,所有的元素和属性都列在每一行中。我知道代码是错误的,但我无法用正确的方式修复它。首先,我选择一个包,遍历元素,并为每个元素输出相关的atributes加上值。 例如: 要素1 属性11、属性12、属性13 元素2 属性21,属性22,属性23

以此类推……我首选的XML文件应该如下所示:

<packageName>
  <Element1>
    <Attribute11>value11</Attribute11>
    <Attribute22>value22</Attribute22>
    <Attribute33>value33</Attribute33>
  </Element1>
  <Element2>
    <Attribute21>value21</Attribute21>
    <Attribute22>value22</Attribute22>
    <Attribute23>value23</Attribute23>
  </Element2>
</packageName>

价值11
价值22
价值33
价值21
价值22
价值23
我希望我能把我的问题说清楚。如果我一个人做不到,我也不会问。当然,如果有人知道如何以不同的方式从图表中获取属性和元素,我会很高兴听到这一点(除了EA提供的工具)。
感谢阅读,非常感谢fpr的帮助;)

首先,在最外层有两个独立的循环。这似乎没用

其次,您在
myPackage.Packages
集合上循环,然后每次通过该循环时,您对循环变量
myPackages
不做任何操作,只需启动内部循环即可。因此,对于myPackage中的每个子包,每个元素都有一个副本(如果没有子包,则没有副本)。很明显,这是必须的

最后,将XElement设置为格式化程序,然后将XML数据连续复制到您自己的字符串中可能不是最好的解决方案。最好先使用XElement构建XML树,然后转储内容

所以它应该是这样的(未测试,未编译):


当然你可以想出一个描述你所面临问题的标题。你是对的,标题不是最佳的,我希望这样更好。你有名为attributen的元素,但你不应该使用XAttribute。请检查:它是
foreach(EA.Element theElements in myPackage.elements)
还是更符合逻辑的
foreach(EA.Element theElements in the packages.Elements)
非常感谢uffe,工作非常完美:)对您的代码稍加修改,应该是XAttribute xAttr=new XAttribute…谢谢!)我编辑了这篇文章,把你的更正纳入其中。
<packageName>
  <Element1>
    <Attribute11>value11</Attribute11>
    <Attribute22>value22</Attribute22>
    <Attribute33>value33</Attribute33>
  </Element1>
  <Element2>
    <Attribute21>value21</Attribute21>
    <Attribute22>value22</Attribute22>
    <Attribute23>value23</Attribute23>
  </Element2>
</packageName>
XElement xPkg = new XElement(myPackage.Name.ToString());

foreach (EA.Element theElement in myPackage.Elements)
{
    XElement xElem = new XElement(theElement.Name.ToString());
    xPkg.Add(xElem);
    foreach (EA.Attribute theAttribute in theElement.Attributes)
    {
        XAttribute xAttr = new XAttribute(theAttribute.Name.ToString(),
                                          theAttribute.Default.ToString()));
        xElem.Add(xAttr);
    }
}

TextWriter tw = new StreamWriter(myPackage.Name.ToString() + ".xml");
tw.WriteLine(xPkg.ToString());
tw.Close();