-1

の値がea_sourceNameea_targetNameときに の値を抽出したい。ea_typeAggregation

 <UML:Association xmi.id="EAID_018EEEB3_9A6B_4102_85C8_3A78261E9AA4" visibility="public" isRoot="false" isLeaf="false" isAbstract="false">
 <UML:ModelElement.taggedValue>
  <UML:TaggedValue tag="style" value="3" /> 
  <UML:TaggedValue tag="ea_type" value="Aggregation" /> 
  <UML:TaggedValue tag="direction" value="Source -> Destination" /> 
  <UML:TaggedValue tag="linemode" value="3" /> 
  <UML:TaggedValue tag="linecolor" value="-1" /> 
  <UML:TaggedValue tag="linewidth" value="0" /> 
  <UML:TaggedValue tag="seqno" value="0" /> 
  <UML:TaggedValue tag="headStyle" value="0" /> 
  <UML:TaggedValue tag="lineStyle" value="0" /> 
  <UML:TaggedValue tag="ea_localid" value="8" /> 
  <UML:TaggedValue tag="ea_sourceName" value="Course" /> 
  <UML:TaggedValue tag="ea_targetName" value="Sem_Progarm" /> 
  <UML:TaggedValue tag="ea_sourceType" value="Class" /> 
  <UML:TaggedValue tag="ea_targetType" value="Class" /> 
  <UML:TaggedValue tag="ea_sourceID" value="18" /> 
  <UML:TaggedValue tag="ea_targetID" value="19" /> 
  <UML:TaggedValue tag="virtualInheritance" value="0" /> 
  </UML:ModelElement.taggedValue>

このコードを試しましたが、何も返されません。私が欲しいのは、ea_sourceNamelikeCourseなどの値を含むリストです

static XNamespace ns2;
ns2 = @"omg.org/UML1.3";
XDoucument MyXmiFile = XDocument.Load(path);
 string Relation = "Association";
 var q = from p in this.MyXmiFile.Descendants(ns2 + Relation)
         select p;

 var m = from p in q.Descendants(ns2 + "TaggedValue")
         where p.Attribute("tag").Value == "ea_type" && p.Attribute("value").Value == "Aggregation"
         select p;

var s = from p in m
        let P1 = p.Attribute("tag").Value
        where P1 == "ea_sourceName"
        select p.Attribute("value").Value;

List<string> Result = new List<string>(s.ToList());
4

2 に答える 2

0

そのタイプの関連付けが複数存在する可能性があると仮定して、それらを取得できるクエリを次に示します。

var doc = XDocument.Load(path);
var relation = "Association";
var targetType = "Aggregation";
XNamespace UML = "omg.org/UML1.3";
var associations =
    from association in doc.Descendants(UML + relation)
    let values = association.Element(UML + "ModelElement.taggedValue")
    where ReadTaggedValue(values, "ea_type") == targetType
    select new
    {
        ea_sourceName = ReadTaggedValue(values, "ea_sourceName"),
        ea_targetName = ReadTaggedValue(values, "ea_targetName"),
    };

タグ付けされた値を読み取るための少しのヘルパーメソッドを使用して:

string ReadTaggedValue(XElement values, string tag)
{
    XNamespace UML = "omg.org/UML1.3";
    return values.Elements(UML + "TaggedValue")
        .Where(e => (string)e.Attribute("tag") == tag)
        .Select(e => (string)e.Attribute("value"))
        .Single();
}
于 2012-10-24T18:17:24.520 に答える
0

この xml ライブラリを使用して、XPath を使用してすべての TaggedValuetag = ea_typeとそのvalue = Aggregation. <tag, value>次に、各要素の辞書を作成します。

XElement root = XElement.Load(file); // or .Parse(xmlstring)
var agg = root.XPath("//TaggedValue[@tag='ea_type' and @value={0}]", "Aggregation");
List<Dictionary<string,string>> list = agg.Select(a => a.Parent.Elements()
        .ToDictionary(b => b.Attribute("tag").Value, 
                      b => b.Attribute("value").Value))
        .ToList();

XPath メソッドにパラメーターを作成し"Aggregation"ました。ハードコードされている可能性がありますが、変数である可能性があると考えました。あれは君次第だ。

于 2012-10-24T17:22:00.010 に答える