Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中读取和迭代xml元素#_C#_Xml - Fatal编程技术网

C# 在C语言中读取和迭代xml元素#

C# 在C语言中读取和迭代xml元素#,c#,xml,C#,Xml,我刚刚开始使用C#语言,寻找一种迭代xml文件中的元素和子元素的方法 我的xml看起来像这样- <ServerList> <server name = "serverName1" username ="username" password ="password"> <serviceName>serviceName</serviceName> <serviceName>serviceName</

我刚刚开始使用C#语言,寻找一种迭代xml文件中的元素和子元素的方法

我的xml看起来像这样-

  <ServerList>
     <server name = "serverName1" username ="username" password ="password">
      <serviceName>serviceName</serviceName>
      <serviceName>serviceName</serviceName>
      <serviceName>serviceName</serviceName>
   </server>
<server name = "serverName2" username ="username" password = "password">
       <serviceName>serviceName</serviceName>
       <serviceName>serviceName</serviceName>
  </server>
<ServerList>

服务名
服务名
服务名
服务名
服务名

我只是在寻找一种方法,在这种方法中,我可以遍历第一个服务器元素及其子元素,而不是下一个服务器元素及其子元素。

您可以使用LINQ to XML作为一种简单的方法:

XDocument xdoc = XDocument.Load("myXmlFile.xml");

var servers = xdoc.Descendants("server"); 
for (var server in servers) 
{
    var children = server.Elements(); 
    for (var child in children)
    {
        // Do what you want with the server and child here
    }
}

如果您需要更多的信息,您可能需要考虑使用XML反序列化。这将允许您定义映射到XML模式中节点的类,将XML反序列化为强类型对象的图形,然后您可以迭代、过滤、转换等。如果您决定使用这种方法,我建议使用,因为BCL XML序列化程序有点糟糕。

您可以使用LINQ to XML作为一种简单的方法:

XDocument xdoc = XDocument.Load("myXmlFile.xml");

var servers = xdoc.Descendants("server"); 
for (var server in servers) 
{
    var children = server.Elements(); 
    for (var child in children)
    {
        // Do what you want with the server and child here
    }
}

如果您需要更多的信息,您可能需要考虑使用XML反序列化。这将允许您定义映射到XML模式中节点的类,将XML反序列化为强类型对象的图形,然后您可以迭代、过滤、转换等。如果您决定使用这种方法,我建议使用BCL XML序列化程序,因为BCL XML序列化程序有点差劲。

子体很好,这里有一个递归方法

class Program
{
    static void Main(string[] args)
    {
        XElement x = XElement.Load("XMLFile1.xml");
        recursive(x.Elements());
        Console.ReadKey();
    }

    private static void recursive(IEnumerable<XElement> elements)
    {
        foreach (XElement n in elements)
        {
            Console.WriteLine(n.Name);
            Console.WriteLine("--");
            if (n.Descendants().Any())
            {
                recursive(n.Elements());
            }
            else
            {
             Console.WriteLine(n.Value.ToString());// End of node (leaf)
            }
        }
    }

}
类程序
{
静态void Main(字符串[]参数)
{
XElement x=XElement.Load(“XMLFile1.xml”);
递归(x.Elements());
Console.ReadKey();
}
私有静态void递归(IEnumerable元素)
{
foreach(元素中的元素n)
{
控制台写入线(n.名称);
Console.WriteLine(“--”);
if(n.后代().任何())
{
递归(n.Elements());
}
其他的
{
Console.WriteLine(n.Value.ToString());//节点结束(叶)
}
}
}
}

子体很好,这里有一个递归方法

class Program
{
    static void Main(string[] args)
    {
        XElement x = XElement.Load("XMLFile1.xml");
        recursive(x.Elements());
        Console.ReadKey();
    }

    private static void recursive(IEnumerable<XElement> elements)
    {
        foreach (XElement n in elements)
        {
            Console.WriteLine(n.Name);
            Console.WriteLine("--");
            if (n.Descendants().Any())
            {
                recursive(n.Elements());
            }
            else
            {
             Console.WriteLine(n.Value.ToString());// End of node (leaf)
            }
        }
    }

}
类程序
{
静态void Main(字符串[]参数)
{
XElement x=XElement.Load(“XMLFile1.xml”);
递归(x.Elements());
Console.ReadKey();
}
私有静态void递归(IEnumerable元素)
{
foreach(元素中的元素n)
{
控制台写入线(n.名称);
Console.WriteLine(“--”);
if(n.后代().任何())
{
递归(n.Elements());
}
其他的
{
Console.WriteLine(n.Value.ToString());//节点结束(叶)
}
}
}
}

这可能重复的可能重复是100%错误的,它将只返回
子项(
servicename
s),而不返回
属性(
name
username
password
)@FarhangAmary
服务器是
XElement
对象。请参阅上的MSDN文档,以了解如何访问属性、子级、子体以及与XML文档中的元素相对应的其他数据。是的,而且,我对您的代码进行了一些修改,我可以按以下方式检索属性:weill@FarhangAmary例如,要获取
name
属性的值,您可以使用
server.Attribute(“name”).Value
@farangamary我刚才解释了如何访问
server
节点的属性,您在评论中提到了这些属性。关于“我告诉过你的答案不完整”,我的答案到底遗漏了什么?这是100%错误的,它只返回
子项
servicename
s),而不返回
属性
,比如(
name
username
password
)@FarhangAmary
服务器是
XElement
对象。请参阅上的MSDN文档,以了解如何访问属性、子级、子体以及与XML文档中的元素相对应的其他数据。是的,而且,我对您的代码进行了一些修改,我可以按以下方式检索属性:weill@FarhangAmary例如,要获取
name
属性的值,您可以使用
server.Attribute(“name”).Value
@farangamary我刚才解释了如何访问
server
节点的属性,您在评论中提到了这些属性。关于“我告诉你的答案不完整”,我的答案到底遗漏了什么?