2

我目前正在与 Enterprise Architect(EA) 合作,我正在编写一个小插件来从模型图中提取属性和属性值并将其提取到 XML 文件中。如何使用 EA-API 没问题,但是因为我对 C# 很陌生,所以我对 C#-Implementation 有问题:

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

String writerString3;
String tagString3;
tagString3 = "";
writerString3 = "";


foreach (EA.Element thePackages in myPackage.Packages)
   { // myPackage = the package I select by MenuClick

    foreach (EA.Element theElements in myPackage.Elements)
     {

      foreach (EA.Attribute theAttribute in theElements.Attributes)
      {

        XElement toXML = new XElement(myPackage.Name.ToString(),
        (new XElement(theElements.Name.ToString(),
        (new XAttribute(theAttribute.Name.ToString(), theAttribute.Default.ToString())))));
        tagString3 = tagString3 + toXML;

       }
      writerString3 = writerString3 + tagString3;
      tagString3 = "";
      }
  }

  foreach (EA.Element theElements in myPackage.Elements)
  {

   foreach (EA.Attribute theAttribute in theElements.Attributes)
   {
    XElement toXML = new XElement(myPackage.Name.ToString(),
    (new XElement(theElements.Name.ToString(),
    (new XAttribute(theAttribute.Name.ToString(), theAttribute.Default.ToString())))));
    tagString3 = tagString3 + toXML;

    }
    writerString3 = writerString3 + tagString3;
    tagString3 = "";
      }

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

输出如下所示://缩短版

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

就这样继续下去,每一行都有所有的元素和属性列表。我知道代码是错误的,但我无法以正确的方式修复它。首先,我选择一个包,遍历元素,对于每个元素,我想输出相关的属性加值。例如:元素 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>

我希望我能把我的问题说清楚。我不会问我是否不能自己做。当然,如果有人知道如何用不同的方式从图表中获取属性和元素,我会很高兴听到这个消息(除了 EA 提供的工具)。感谢阅读,非常感谢 fpr 的帮助;)

4

1 回答 1

1

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

其次,您正在遍历myPackage.Packages集合,然后每次通过该循环时,您都对循环变量不做任何事情,myPackages而只是启动到完成工作的内部循环。因此,对于 myPackage 中的每个子包,您最终会得到每个元素的一个副本(如果没有子包,则没有)。很明显,这必须过去。

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

所以它应该看起来像这样(未测试,未编译):

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();
于 2013-07-16T07:40:11.937 回答