Есть набор xml файлов, описывающих среду тестирования.
Внутри таких файлов есть ссылки на папки, другие xml файлы.
Среда пользуется системными переменными типа $(MYPRODUCT_PATH), ссылки могут выглядеть как:
$(MYPRODUCT_PATH)\config\config.xml
А равно как и абсолютными путями.
Есть ли приложения для просмотра дерева ссылок? Заменить системные переменные реальными и просканировать папки-файлы
Вроде несложно самому написать, но должно ж уже иметь место быть.
Здравствуйте, gok, Вы писали:
gok>Есть набор xml файлов, описывающих среду тестирования. gok>Внутри таких файлов есть ссылки на папки, другие xml файлы. gok>Среда пользуется системными переменными типа $(MYPRODUCT_PATH), ссылки могут выглядеть как: gok>$(MYPRODUCT_PATH)\config\config.xml gok>А равно как и абсолютными путями. gok>Есть ли приложения для просмотра дерева ссылок? Заменить системные переменные реальными и просканировать папки-файлы gok>Вроде несложно самому написать, но должно ж уже иметь место быть.
Данные могут очень по разному храниться в xml
using System;
using System.Xml;
using System.Text.RegularExpressions;
class Program {
static void ReadAllNodes(XmlReader xr,Action<string> handler) {
while (xr.Read()) {
if (xr.NodeType == XmlNodeType.CDATA || xr.NodeType == XmlNodeType.Text) {
foreach (var line in xr.Value.Split('\r','\n')) {
var s = line.Trim();
if (s.Length > 0) handler(s);
}
}
if (xr.NodeType == XmlNodeType.Element) {
for (int i = 0; i < xr.AttributeCount; i++) {
handler(xr[i]);
}
}
}
}
static void FindPaths(XmlReader xr,Action<string> handler) {
var re1 = new Regex(@"\$\([^)]+\)");
var re2 = new Regex(@"\.xml$",RegexOptions.IgnoreCase);
ReadAllNodes(xr,text => {
if (re1.IsMatch(text) || re2.IsMatch(text)) handler(text);
});
}
static string ExpandPath(string src,Func<string,string> expander) {
var re = new Regex(@"\$\(([^)]+)\)");
return re.Replace(src,match => expander(match.Groups[1].Value));
}
static string EnvExpander(string name) {
var res=Environment.GetEnvironmentVariable(name);
return res == null ? "$(" + name + ")" : res;
}
static void Main(string[] args) {
using (var xr = XmlReader.Create("test.xml")) {
FindPaths(xr,path => {
var fpath = ExpandPath(path,EnvExpander);
Console.WriteLine(fpath);
});
}
}
}
Здравствуйте, gok, Вы писали:
gok>А может Regex создать лист из *.xml или подняться выше на этаж для ../text.xml. Или все же ручками надо?
Смотрите сами — всё же зависит от ваших данных и того результата который вам нужен. Да и потом лучше складывайте ссылки в список и потом проверять ходили вы туда уже или нет.
Более того возможны варианты ссылок куда ходить не надо.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, gok, Вы писали:
gok>>А может Regex создать лист из *.xml или подняться выше на этаж для ../text.xml. Или все же ручками надо? _>Смотрите сами — всё же зависит от ваших данных и того результата который вам нужен. Да и потом лучше складывайте ссылки в список и потом проверять ходили вы туда уже или нет. _>Более того возможны варианты ссылок куда ходить не надо.
да это понятно.
а все же *.xml ../text.xml Regex сможет? я новичок в с#
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, gok, Вы писали:
gok>>а все же *.xml ../text.xml Regex сможет? я новичок в с# _>да без проблем https://regexr.com/ _>
_>var re = new Regex(@"\.xml$",RegexOptions.IgnoreCase); // всё что кончается на .xml или .XmL ... - аналог *.xml
_>
моя ужасная версия предобработки:
if (Path.GetFileNameWithoutExtension(initFile.FilePath) == "*")
{
// expend *.xml
initFile.FileStatus = xmlFile.Status.WildCardExt;
TreeNodes.Add(initFile);
DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(initFile.FilePath));
foreach (FileInfo thisFile in directoryInfo.GetFiles("*.xml"))
{
xmlFile newFile = new xmlFile(initFile.ParentId, thisFile.FullName);
filesToProcess.Add(newFile);
}
}
else if (initFile.FilePath.Contains(".."))
{
// expend ..\abc.xmlstring fileName = Path.GetFileName(initFile.FilePath);
var re = new Regex(@"/+");
string thisPath = re.Replace(initFile.FilePath, "\\").ToUpper();
int howMany = 0;
string path = thisPath;
do {
path = Regex.Replace(path, @"\.\.", "=");
howMany++;
} while (path.Contains(".."));
foreach ( xmlFile thisFile in TreeNodes.Where(x => x.Id == initFile.ParentId))
{
thisPath = Path.GetDirectoryName(thisFile.FilePath);
for (int i = 0; i < howMany; i++)
thisPath = Path.GetDirectoryName(thisPath);
thisPath = Path.Combine(thisPath, fileName);
xmlFile newFile = new xmlFile(initFile.Id, thisPath);
filesToProcess.Add(newFile);
}
}