2016-08-08 5 views
0

У нас есть модель, которая содержит пакеты и подпакеты. Так как мы можем переместить указатель на конкретный пакет по имени пакета. Так есть какой-либо способ итерации по модели и получения пакет по имениКак получить доступ к пакету по названию

ответ

1

Использование

Repositore.SQLQuery("SELECT package_id FROM t_package WHERE name=<theName>") 

Это возвращает результирующий XML набор, содержащий все пакеты с именем, которое вы ищете. Это может выглядеть следующим образом:

<?xml version="1.0"?> 
<EADATA version="1.0" exporter="Enterprise Architect"> 
    <Dataset_0><Data><Row><package_id>1</package_id></Row><Row><package_id>2</package_id></Row><Row><package_id>3</package_id></Row></Data></Dataset_0></EADATA> 

Таким образом, вы можете либо материал, который в XML-парсер или использовать регулярное выражение как

/package_id>(\d+)/ 

фильтровать все пакеты-идентификаторы.

В свою очередь, просто использовать

Repository.GetPackageById(<found id>) 

для доступа найденного пакета (ов).

+1

Можем ли мы получить объект типа EA.Package из этого –

+0

см. Мое издание о том, как получить доступ к элементам пакета. –

0

Как было отмечено в комментарии, это будет работать:

List<EA.Package> myPacks = new List<EA.Package>(); 

public void GOThroughAllPackages(EA.Package  dumpPackage) 
    { 
     foreach (EA.Package packages in  dumpPackage.Packages) 
      { 
         if(packages.Name.ToLower().Equals(requiredPackName)) 
        { 
         myPacks.Add(packages); 
         break; 
        } 
       GOThroughAllPackages(packages); 
      } 
} 
+0

Это не решает и просто ищет пакеты верхнего вида. (Вам нужно отступывать свой код 4 пробела) –

+0

Спасибо Томас за то, что указал, сделал изменения – GuestUser

+0

Ну, теперь он рекурсирует, но что, если пакетов больше, чем одного с именем? Он возвращает только последний (самый глубокий уровень рекурсии). Скорее, он должен создать список пакетов. –

0

Альтернативное решение (C#), который не требует разбора XML строку:

 List<EA.Package> packages = new List<EA.Package>(); 
     string searchValue = "somePackageName"; 
     var packageElements = Repository.GetElementSet("select o.Object_ID from t_object o inner join t_package p on p.ea_guid = o.ea_guid where o.Name = '"+searchValue+"'",2); 
     foreach (EA.Element packageElement in packageElements) 
     { 
      packages.Add(Repository.GetPackageByGuid(packageElement.ElementGUID);) 
     } 

Он использует Repository.GetElementSet() с параметром 2, в котором говорится, что он принимает SQL-запрос.
Обратите внимание, что это решение не будет возвращать корневые пакеты, поскольку у них нет аналога t_object.

Смежные вопросы