Просмотреть XML дочерний - PullRequest
       7

Просмотреть XML дочерний

0 голосов
/ 20 сентября 2018

У меня небольшая проблема с чтением файла XML на C #.Это мой XML-файл:

<?xml version = "1.0" encoding="ISO8859-1" standalone="yes" ?>
<SITES>
    <SITE>
        <ERROR_COUNTER>0</ERROR_COUNTER>
        <PROD>0</PROD>
        <LOGINFO>
            <URL>http://site1.com/login</URL>
            <LOGIN>login</LOGIN>
            <PASSWORD>pass</PASSWORD>
            <DELAYMAX>20</DELAYMAX>
        </LOGINFO>
        <EMAIL>
            <TO>dsds@dee.com, dsdsddd@dee.com,dsdds@dee.com</TO>
            <SUBJECT></SUBJECT>
            <BODY></BODY>
            <PATH></PATH>
        </EMAIL>
        <TESTS>
            <TEST>
                <URL>http://site1.com/settings</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
            <TEST>
                <URL>http://site1.com/faq</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
            <TEST>
                <URL>http://site1.com/download-faq-pdf</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
        </TESTS>
    </SITE>
    <SITE>
        <ERROR_COUNTER>0</ERROR_COUNTER>
        <PROD>0</PROD>
        <LOGINFO>
            <URL>http://site2.com/login</URL>
            <LOGIN>login2</LOGIN>
            <PASSWORD>pass2</PASSWORD>
            <DELAYMAX>20</DELAYMAX>
        </LOGINFO>
        <EMAIL>
            <TO>dsds@dee.com, dsdsddd@dee.com,dsdds@dee.com</TO>
            <SUBJECT></SUBJECT>
            <BODY></BODY>
            <PATH></PATH>
        </EMAIL>
        <TESTS>
            <TEST>
                <URL>http://site2.com/settings</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
            <TEST>
                <URL>http://site2.com/faq</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
            <TEST>
                <URL>http://site2.com/download-faq-pdf</URL>
                <DELAYMAX>5</DELAYMAX>
            </TEST>
        </TESTS>
    </SITE>
</SITES>    

Так что я хотел бы иметь возможность в C # просматривать список моих сайтов (у меня их может быть несколько десятков), для этого я сделал это:

    XmlDocument xml = new XmlDocument();
    xml.Load(@"D:\REM\config.xml");
    foreach (XmlElement ndSites in xml.SelectNodes("SITES/SITE"))
    {
        Console.WriteLine(ndSites.GetElementsByTagName("ERROR_COUNTER"));
    }

Но как только я это сделаю, я не знаю, как получить доступ к ценностям моих детей, не говоря уже о том, как сделать второй цикл в моих ТЕСТАХ, а затем получить доступ к каждому дочернему ТЕСТУ и получить мои URL-адреса..

Моя цель - получить для каждого веб-сайта информацию о соединении в LOGINFO, затем URL-адреса в TESTS, TEST и для всех существующих САЙТОВ.

Я много чего пробовал, но я не нашел ничего, что соответствует тому, что мне нужно.

Если кто-то может мне помочь.

РЕДАКТИРОВАТЬ: Это мой класс для десериализации кода C #

class XMLParser
{
    public XMLParser() { }
    public List<Site> readXML(XmlDocument xml)
    {
        List<Test> tests = new List<Test>();
        Test test;

        List<Site> sites = new List<Site>();
        Site site;

        //List<url>;
        foreach (XmlElement ndSites in xml.SelectNodes("SITES/SITE"))
        {
            int idSite = int.Parse(ndSites.Attributes[0].Value);
            site = new Site();
            int prod = int.Parse(ndSites["PROD"].InnerText);
            int error = 0;
            int max = 3;

            foreach (XmlElement ndError in ndSites.SelectNodes("/ERROR"))
            {
                error = int.Parse(ndError["COUNTER"].InnerText);
                max = int.Parse(ndError["MAX"].InnerText);
            }
            foreach (XmlElement ndLogin in ndSites.SelectNodes("LOGINFO"))
            {
                site = new Site(idSite, ndLogin["URL"].InnerText, ndLogin["LOGIN"].InnerText, ndLogin["PASSWORD"].InnerText, error, prod, max);
            }

            foreach (XmlElement ndTests in ndSites.SelectNodes("TESTS/TEST"))
            {
                test = new Test(ndTests["URL"].InnerText, int.Parse(ndTests["DELAYMAX"].InnerText));
                tests.Add(test);
            }
            site.lstTest = tests;
            sites.Add(site);
        }
        return sites;
    }

Но у меня есть другая проблема, когда я использую мой сайтобъект, o имеет шесть элементов, все URL-адреса моего сайта 1 и все URL-адреса моего сайта 2.

Например, для моего XML-файла выше у меня будет два объекта Test из шести элементов

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Я уверен, что вы можете сделать что-то вроде этого:

var MiXMLD = new XmlDocument();

MiXMLD.Load(@"C:\path\MiXML.xml");

if (!(MiXMLD == null))
{
    XmlElement mXMLERaiz = MiXMLD.DocumentElement;

    foreach (XmlNode mXMLN in mXMLERaiz.ChildNodes)
    {
        // if type is <SITE>
        if ((mXMLN.Name == "SITE"))
        {
            //In this point you can see the attributes
            if ((mXMLN.Attributes.Count > 0))
            {
                foreach (XmlAttribute mAtr in mXMLN.Attributes)
                {
                    if ((mAtr.Name == "Exalmple"))
                    {
                        var attr = mAtr.Value;
                    }
                    else if ((mAtr.Name == "Example"))
                    {
                        var attr = mAtr.Value;
                    }

                }

            }

            // first node child of element of <parent>
            // you already know the type <Type>
            XmlElement mXMLchild = (XmlElement)mXMLN.FirstChild;

            // aniway check the Type
            if ((mXMLchild.Name == "Type"))
            {
                var mChild = mXMLchild.FirstChild.Value;
            }

        }
    }
}  

Конечно, вы должны прочитать каждый элемент.

0 голосов
/ 20 сентября 2018

Просто вы можете работать со ссылочным значением, с вашим кодом, если он истинный, но я хорошо выполнил.

, если вы хотите работать с кодом xml, вы должны знать эту структуру также.это:

XmlDocument xml = new XmlDocument();
xml.Load(@"D:\REM\config.xml");
foreach (XmlElement ndSites in xml.SelectNodes("your node"))
{
    Console.WriteLine(ndSites.GetElementsByTagName("your node"));
}

Этот метод, GetElementsByTagName() получить все xml раздел, который вы хотите, и вы можете работать с этим, как:

XmlDocument xml = new XmlDocument();
xml.Load(@"D:\REM\config.xml");
foreach (XmlElement ndSites in xml.SelectNodes("your node"))
{
    var xmlNode = ndSites.GetElementsByTagName("your node");
    if(xmlNode != null && xmlNode.contain("your node that you want"))
    {
        foreach(var item in xmlNode.GetElementByTagName(your node that you want))
        {
             console.write(item.value);
        }
    }
}

Для получения дополнительной информации, это хорошочто посещение это

0 голосов
/ 20 сентября 2018

Вы можете использовать эти оболочки.Загрузите XML и поместите его в оболочку.

public class TestsXmlWrapper
{
    private XmlDocument _xml;
    public TestsXmlWrapper(XmlDocument xml)
    {
        _xml = xml;
    }
    public IEnumerable<Site> Sites
    {
        get
        {
            foreach (XmlElement site in _xml.SelectNodes("SITES/SITE"))
            {
                yield return new Site(site);
            }
        }
    }
}

public class Site
{
    private XmlElement _site;
    public Site(XmlElement site)
    {
        _site = site;
    }

    public String ErrorCount => _site.SelectSingleNode("ERROR_COUNTER")?.InnerText;
    public String LoginUrl => _site.SelectSingleNode("LOGINFO/URL")?.InnerText;
    public String Username => _site.SelectSingleNode("LOGINFO/LOGIN")?.InnerText;
    public String Password => _site.SelectSingleNode("LOGINFO/PASSWORD")?.InnerText;
    public IEnumerable<Test> Test
    {
        get
        {
            foreach (XmlElement test in _site.SelectNodes("TESTS/TEST"))
            {
                yield return new Test(test);
            }
        }
    }
}

public class Test
{
    private XmlElement _test;
    public Test(XmlElement test)
    {
        _test = test;
    }
    public String Url => _test.SelectSingleNode("URL")?.InnerText;
}
...the same for email
0 голосов
/ 20 сентября 2018

Я, вероятно, неправильно понимаю, в чем ваша проблема.Просто храните свои XML-данные в бизнес-классе, например

public class Site
{
    public int ErrorCounter { get; set; }
    public LogInfo LogInfos  { get; set; }
    public Email Email { get; set; }
    public List<Test> Tests { get; set; } = new List<Test>();
}

. Вы десериализуете свой XML в списке своего класса, так же, как вы это уже делаете.Тогда вы можете получить доступ ко всем вашим данным

List<Site> siteList = new List<Site>();
XmlDocument xml = new XmlDocument();
xml.Load(@"D:\REM\config.xml");
foreach (XmlElement ndSites in xml.SelectNodes("SITES/SITE"))
{
    siteList.ErrorCounter = int.Parse(ndSites["ERROR_COUNTER"].innerText); // You should handle the potential parse error expression
    /** do it for all you need */


    foreach (XmlElement ndTests in ndSites.SelectNodes("TESTS/TEST"))
    {
       Test currentTest = new Test();
       /** Fill it **/
       siteList.Tests.add(currentTest);
    }
}

Что-то об этом, у меня нет идеала для тестирования.Надеюсь это был твой вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...