Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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.net中解析xml_C#_Xml - Fatal编程技术网

C# 如何在C.net中解析xml

C# 如何在C.net中解析xml,c#,xml,C#,Xml,我有一个xml文件,例如: <?xml version="1.0" encoding="UTF-8"?> <Request> <Authenticate> <Username>Username</Username> <Token>Token</Token> </Authenticate> <

我有一个xml文件,例如:

<?xml version="1.0" encoding="UTF-8"?>

    <Request>
        <Authenticate>
            <Username>Username</Username>
            <Token>Token</Token>
        </Authenticate>
        <Fields>
            <Group name="test">
                <Field>
                    <Name>Field 1</Name>
                    <Type>string</Type>
                </Field>
                <Field>
                    <Name>Field 2</Name>
                    <Type>string</Type>
                </Field>
            </Group>
            <Group name="Group 2">
                <Field>
                    <Name>Field 3</Name>
                    <Type>string</Type>
                </Field>
                <Field>
                    <Name>Field 4</Name>
                    <Type>string</Type>
                </Field>
            </Group>
        </Fields>
    </Request>
XmlReader reader = XmlReader.Create(FilePath);
while(reader.Read()) {}
但是如何访问节点呢? 还有这个团体的名字? 有人能帮我吗?
谢谢,XmlReader使您能够解析XML,而无需将其加载到内存中。这对于大型XML文件非常有用。例如,如果要获取组的所有名称属性,可以执行以下操作:

using (var reader = XmlReader.Create("test.xml"))
{
    while (reader.Read())
    {
        if (reader.IsStartElement() && reader.Name == "Group")
        {
            // we are inside the Group element. We can now read its attributes
            string name = reader.GetAttribute("name");
            Console.WriteLine(name);
        }
    }
}
另一方面,如果您的XML没有那么大,您可以将其加载到提供了执行XPath查询和检索所需信息的更方便的方法的中:

var doc = XDocument.Load("test.xml");
var groups = doc.XPathSelectElements("/Request/Fields/Group");
foreach (var group in groups)
{
    Console.WriteLine(group.Attribute("name").Value);
}
使用

还是常规

或者,如果你想让它看起来很别致,用它来把它变成一个物体

如果仍然想使用XMLReader,只需在while循环中调用以检查每个元素。使用GetElement或GetAttribute获取XML文档中每个项目的相关部分。例如:

if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Group"))
  if (xmlReader.HasAttributes)
    name = xmlReader.GetAttribute("name");

您可以使用System.Xml.Linq.XDocument来实现这一点。使用起来更简单、更舒适:

string strXml = File.ReadAllText(xFilePath);
XDocument xd = XDocument.Parse(strXml);
var xNode = xd.Element("Request").Element("Fields").Elements("Group").FirstOrDefault(e => e.Attribute("name").Value == "Group 2");

另一种选择是使用xml序列化

XmlSerializer ser = new XmlSerializer(typeof(SO.Request));
using(var f = File.Open(filename,FileMode.Open))
{
    var requests = (SO.Request)ser.Deserialize(f);
}

我已经测试过xmlreader,它可以正常工作,但如何在节点之间循环呢?例如,如果我在组内,我希望循环字段。与我对组节点所做的相同:if reader.Name==字段{…您在字段节点内…}。以此类推。使用[code]ifreader.Name==Field[/code]它不起作用,我认为名称仍然是组,我认为我必须移动到元素?组节点可以包含许多字段属性,所以我需要一个循环,同样对于组,因为xml可以包含许多组。它应该是一个单独的声明。您应该意识到,如果您决定使用XmlReader,您需要跟踪您所在节点的临时变量。使用reader.IsStartElement和reader.Name的组合来确定您当前在XML文档中的确切位置。是的,我刚刚尝试过Linq2XML确实更容易,但我仍然有问题。这是我的代码:代码XDocument doc=XDocument.LoadfileName;doc.Root.Elements中的foreach XElement el{el.Elements中的foreach XElement字段{field.Elements中的foreach XElement组{output=group.Attributename.Value;}}}我用foreach编写的代码使它更简单。您没有指定要返回的witch元素。XDocument doc=XDocument.LoadfileName;foreach-XElement-el-in-doc.Root.ElementsRequest{foreach-XElement-fields中的字段{foreach-XElement-group-in-field.ElementsGroup{output=group.Attributename.Value;}}}}}谢谢,我想我现在已经得到了,但是我的var输出仍然是空的。
public class SO
{
    public class Request
    {
        public Authenticate Authenticate { get; set; }
        public List<Group> Fields { get; set; }
    }

    public class Authenticate
    {
        public string Username { get; set; }
        public string Token { get; set; }
    }

    public class Group
    {
        [XmlAttribute("name")]
        public string Name { get; set; }
        [XmlElement("Field")]
        public List<Field> Fields { get; set; }
    }

    public class Field
    {
        public string Name { get; set; }
        public string Type { get; set; }
    }
}