我在读取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对象
答案 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