浏览XML子级

时间:2018-09-20 12:45:33

标签: c# xml xmldocument

我在读取C#上的XML文件时遇到了一些问题。 这是我的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"));
    }

但是,一旦完成此操作,我就不知道如何访问孩子的值,更不用说如何在TESTS上进行第二次循环,然后访问每个孩子的TEST并检索我的URL。

我的目标是在每个网站上检索LOGINFO中的连接信息,然后在TESTS,TEST中以及所有存在的SITES中检索URL。

我尝试了很多事情,但没有找到任何符合我需要的东西。

如果有人可以帮助我。

编辑:这是我的反序列化代码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;
    }

但是我还有另一个问题,当我使用Site对象时,o具有六个元素,即网站1的所有URL和网站2的所有URL。

例如,对于上面的XML文件,我将有两个包含六个元素的Test对象

4 个答案:

答案 0 :(得分:3)

简单来说,您可以使用参考值,如果为true,则可以使用您的代码,但我做得很好。

当您想使用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);
        }
    }
}

有关更多信息,请访问this

答案 1 :(得分:2)

我确定您可以执行以下操作:

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;
            }

        }
    }
}  

当然,您必须阅读每个元素。

答案 2 :(得分:1)

我可能会误解您的问题了。只需将xml数据存储在

之类的业务类中
import sys # if you haven't imported it already
import os.path

home = os.path.dirname(sys.argv[0])
sys.path.append( os.path.join(home, "EOC_Module/eoc/script") )

# now, you can import straight from the script directory
import EOC_Intraction

您可以使用已经执行的相同方法在类列表中反序列化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>();
}

关于这一点,我没有测试的依据。 希望这是你的问题

答案 3 :(得分:0)

您可以使用这些包装程序。加载XML并将其放入包装器中。

Type