使用C#中的不同元素读取XML

时间:2013-08-13 13:59:28

标签: c# xml xml-parsing

我知道,解析C#有很多问题,但我找不到答案。 所以,我需要编写一个用于解析XML的DLL,但是有一些功能,因为我不知道XML文件中有哪些元素。我需要解析文件的所有节点及其元素。我该怎么做?现在,我正在使用简单文件

<reg>
    <email_login>paykforcycvert@reincarnate.com</email_login>
    <email_password>nDOUn3TybD</email_password>
</reg>

我的dll代码现在是

public XmlNodeList GetElementsName(string path)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(path);
    XmlNodeList nodeList = xmlDoc.GetElementsByTagName("email_login");
    return nodeList;
}

应返回“paykforcycvert@reincarnate.com”。 我的控制台应用程序:

XMLWorker worker = new XMLWorker();
string path = "file:///D:/temp/test.xml";
XmlNodeList nodeList = worker.GetElementsName(path);
for (int i = 0; i < nodeList.Count; i++)
    Console.WriteLine(nodeList[i].InnerText);
Console.ReadLine();

但它返回“paykforcycvert@reincarnate.comnDOUn3TybD”

我如何以不同方式解析?

5 个答案:

答案 0 :(得分:3)

使用LINQ to XML

XElement reg = XElement.Load(path);
string login = (string)reg.Element("email_login");

BTW 您的代码对我来说很好。确保您没有选择所有元素而不是email_login。即如果您要获取子节点XmlNodeList nodeList = xmlDoc.ChildNodes;而不是按标记名称获取元素,那么您将获得结果。

或者您可能有几个名为email_login的元素。例如。以下xml将使用您的代码生成结果:

<reg>
  <email_login>paykforcycvert@reincarnate.com</email_login>
  <email_login>nDOUn3TybD</email_login>
</reg>

答案 1 :(得分:0)

你可以这样做

public List<String> getElementValues(string path,string elementName)
{
    XElement doc= XElement.Load(path);
    var elementList=doc.Descendants().Elements();
    return elementList.Where(x=>x.Name.LocalName==elementName)
                      .Select(y=>y.Value)
                      .ToList();
}

现在,您可以获取名称为email_login

的元素的所有值
var values=getElementValues(path,"email_login");

答案 2 :(得分:0)

我运行了与您提供的完全相同的代码,并将paykforcycvert@reincarnate.com作为输出,因此我的猜测是您在修复某些内容后未构建项目或未进行清理。

尝试清理项目并再次运行

答案 3 :(得分:0)

在处理您在XMLFile.xml中提供的XML数据后,我运行了以下代码来模拟输出:

class Program
{
    static void Main(string[] args)
    {
        XMLWorker worker = new XMLWorker();
        //
        string path = @"C:\Users\abc\Desktop\ConsoleApplication1\ConsoleApplication1\XMLFile.xml";
        XmlNodeList nodeList = worker.GetElementsName(path);
        for (int i = 0; i < nodeList.Count; i++)
        Console.WriteLine(nodeList[i].InnerText);
        Console.ReadLine();
    }       
}

public class XMLWorker
{
    public XmlNodeList GetElementsName(string path)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(path);
        XmlNodeList nodeList = xmlDoc.GetElementsByTagName("email_login");

        return nodeList;
    }
}

但对我而言,它运作良好。

答案 4 :(得分:0)

您还可以使用XPath查询:

XmlNodesList nodesList = xmlDoc.SelectNodes("//email_login"));
foreach(string oneNode in nodesList) 
{
    Console.Write(oneNode.InnerText);
}