2

私は現在エンタープライズ アーキテクト (EA) を使用しており、モデル ダイアグラムから属性と属性値を抽出して XML ファイルに抽出するための小さなアドインを作成しています。EA-API の使用方法は問題ありませんが、私は C# に慣れていないため、C# の実装に問題があります。

最初にコードを投稿し、次に出力ファイルの一部を投稿し、次にどのような出力が必要かの例を投稿します。したがって、少なくとも質問には、私のコードよりも優れた構造があります;)

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 から提供されたツール以外に) それを聞いて喜んでいます。読んでくれてありがとう、そして助けてくれてありがとう;)

4

1 に答える 1

1

まず、最も外側のレベルに 2 つの別々のループがあります。これは役に立たないようです。

第二に、あなたはmyPackage.Packagesコレクションをループしています。そのループを通過するたびに、ループ変数で何もせずmyPackages、作業を行う内部ループを起動するだけです。そのため、myPackage 内の各サブパッケージの各要素のコピーが 1 つずつ作成されます (サブパッケージがない場合はコピーが作成されません)。明らかに、それは行かなければなりません。

最後に、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 に答える