трассер для хмл
От: gok Россия  
Дата: 23.05.19 17:00
Оценка:
Есть набор xml файлов, описывающих среду тестирования.
Внутри таких файлов есть ссылки на папки, другие xml файлы.
Среда пользуется системными переменными типа $(MYPRODUCT_PATH), ссылки могут выглядеть как:
$(MYPRODUCT_PATH)\config\config.xml
А равно как и абсолютными путями.
Есть ли приложения для просмотра дерева ссылок? Заменить системные переменные реальными и просканировать папки-файлы
Вроде несложно самому написать, но должно ж уже иметь место быть.
gok
Re: трассер для хмл
От: kov_serg Россия  
Дата: 23.05.19 20:48
Оценка: 6 (1)
Здравствуйте, 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);
            });
        }
    }
}
Re[2]: трассер для хмл
От: gok Россия  
Дата: 24.05.19 22:20
Оценка:
здорово!
А может Regex создать лист из *.xml или подняться выше на этаж для ../text.xml. Или все же ручками надо?
        static void TraceXml(int level, string inputUri)
        {
            level++;
            if (Path.GetExtension(inputUri) != ".xml")
            {
                Console.WriteLine(string.Join("", Enumerable.Repeat(' ', level)) + string.Format("File {0} is not XML.", inputUri));
                return;
            }
            // learn to read ../test.xml, *.xml
            if (!File.Exists(inputUri))
            {
                Console.WriteLine(string.Join("", Enumerable.Repeat(' ', level)) + string.Format("File {0} not exists yet.", inputUri));
                return;
            }
            Console.WriteLine(string.Join("", Enumerable.Repeat(' ', level)) + inputUri);
            using (var xr = XmlReader.Create(inputUri))
            {
                FindPaths(xr, path =>
                {
                    var fpath = ExpandPath(path, EnvExpander);
                    TraceXml(level, fpath);
                });
            }
        }
        static void Main(string[] args)
        {
            string inputUri = Environment.CurrentDirectory + "/Support/bcadtestapp.xml";
            int level = 0;
            TraceXml(level, inputUri);
        }
gok
Отредактировано 24.05.2019 22:22 gok . Предыдущая версия .
Re[3]: трассер для хмл
От: kov_serg Россия  
Дата: 25.05.19 08:27
Оценка:
Здравствуйте, gok, Вы писали:

gok>А может Regex создать лист из *.xml или подняться выше на этаж для ../text.xml. Или все же ручками надо?

Смотрите сами — всё же зависит от ваших данных и того результата который вам нужен. Да и потом лучше складывайте ссылки в список и потом проверять ходили вы туда уже или нет.
Более того возможны варианты ссылок куда ходить не надо.
Re[4]: трассер для хмл
От: gok Россия  
Дата: 26.05.19 04:11
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, gok, Вы писали:


gok>>А может Regex создать лист из *.xml или подняться выше на этаж для ../text.xml. Или все же ручками надо?

_>Смотрите сами — всё же зависит от ваших данных и того результата который вам нужен. Да и потом лучше складывайте ссылки в список и потом проверять ходили вы туда уже или нет.
_>Более того возможны варианты ссылок куда ходить не надо.
да это понятно.
а все же *.xml ../text.xml Regex сможет? я новичок в с#
gok
Re[5]: трассер для хмл
От: kov_serg Россия  
Дата: 26.05.19 07:17
Оценка:
Здравствуйте, gok, Вы писали:

gok>а все же *.xml ../text.xml Regex сможет? я новичок в с#

да без проблем https://regexr.com/
var re = new Regex(@"\.xml$",RegexOptions.IgnoreCase); // всё что кончается на .xml или .XmL ... - аналог *.xml
Re[6]: трассер для хмл
От: gok Россия  
Дата: 04.06.19 20:08
Оценка:
Здравствуйте, 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.xml
                string 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);
                }
            }
gok
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.