C#XML从节点中选择值

时间:2018-02-12 13:26:55

标签: c# xml

我想从节点中选择所有值,但是有些错误,因为消息框不显示任何内容。 XML文件位于同一文件夹中,即项目。

XML:

<?xml version="1.0" encoding="UTF-8" ?>
<names>
    <file>
        <name>Test name 1</name> 
        <author>Test author 1</author> 
        <version>1.0</version> 
    </file>

    <file>
        <name>Test name 2</name> 
        <author>Test author 2</author> 
        <version>2.0</version> 
    </file>

    <file>
        <name>Test name 3</name> 
        <author>Test author 3</author> 
        <version>3.0</version> 
    </file>

</names>

C#代码:

XmlDocument xml = new XmlDocument();
xml.LoadXml(Files.xml); 

XmlNodeList xnList = xml.SelectNodes("names/file/name");
foreach (XmlNode xn in xnList)
{
    MessageBox.Show(xn.ToString());
}

3 个答案:

答案 0 :(得分:2)

LoadXml从指定的字符串加载XML文档。如果要按路径加载xml,请使用Load(filePath)。

 XmlDocument xml = new XmlDocument();
 xml.Load(@"C:\Sample.xml");

 XmlNodeList xnList = xml.SelectNodes("names/file/name");
 foreach (XmlNode xn in xnList)
 {
     Console.WriteLine(xn.InnerText);
 }

// outputs,
// Test name 1
// Test name 2
// Test name 3

答案 1 :(得分:0)

您应该验证Files.xml属性是否为包含示例XML的string(假设它是属性)。 LoadXml直接从给定的string加载XML数据。

我已经按原样使用了您的代码,但它运行正常。最好在//方法调用中使用SelectNodes前缀从根开始,但即使没有这个更改,它也应该按预期工作。

XmlDocument xml = new XmlDocument();
xml.LoadXml(File.ReadAllText("test.xml"));

XmlNodeList xnList = xml.SelectNodes("//names/file/name");
foreach (XmlNode xn in xnList)
{
    Console.WriteLine(xn.ToString());
}

答案 2 :(得分:0)

如果您使用值“attributes”而不是添加节点并将内部文本更改为它,那么对您来说会更容易,并且设置和获取会更容易。 例如,如果你的XML喜欢这个

<names>
    <file name="Test name 1" author="Test author 1" version="1.0" />
    <file name="Test name 2" author="Test author 2" version="2.0" />
    <file name="Test name 3" author="Test author 3" version="3.0" />
</names>

对于您的代码,您可以使用以下

    try
                    {
                        XDocument doc = XDocument.Load(@"C:\Sample.xml");
                        foreach (var files in doc.Descendants("names"))
                        {
//remember value will be null if the attribute is missing
//to present the values it is going to be 
 Console.WriteLine("File Name : " + (string)files.Attribute("name") + ", File Author :" + (string)files.Attribute("author") + ", File Version : " + (string)files.Attribute("version"));
//if you want to set a specific attribute                           
                            if ((string)files.Attribute("name") == "Example")
                            {
                                task.SetAttributeValue("author", "Example Author");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                       //your exception here
                    }