XMLReader - 如何阅读这个 element/node 模式

XMLReader - How to read this element/node pattern

这是一些 XML 我需要能够阅读的内容。我需要获取分配给某些变量的每个功能的 QualitySetting 值:

   <?xml version="1.0" encoding="UTF-8" ?>
   <GraphicsConfig>
      <FX>
       <Off>
           <LocalisationName>$QUALITY_OFF;</LocalisationName>
        <Item>
            <Feature>LightCones</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>LensFlares</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>Debris</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>ParticleEffects</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>Trails</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>Beams</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
        <Item>
            <Feature>Fog</Feature>
            <QualitySetting>0</QualitySetting>
        </Item>
    </Off>
   </FX>
 </GraphicsConfig>

我正在使用 XMLReader,我通常使用如下内容:

Dim guiSettings = XElement.Load(_localAppDataFilePath & "\Frontier Developments\Elite Dangerous\Options\Graphics\GraphicsConfigurationOverride.xml")
            target = guiSettings.Element("GUIColour").Elements("Default").[Single]()
            r = target.Element("MatrixRed").Value

愿意以其他方式做到这一点,如果没有简单的方法来做到这一点,我非常乐意找到具有适当名称的 <Feature> 元素,然后只需读取下一个节点,但我想问一下,因为我一直想提高我的 XML 编辑知识。

下面的代码结合使用了 XmlReader 和 XML Linq。我已经多次发布此解决方案。在这种情况下,我的偏好是不使用 XmlReader,而是使用 XML Linq 将结果放入字典并发布该代码。对于巨大的 XML 文件,最好始终使用 XmlReader 以避免内存不足错误。

我用 c# 和 vb.net

发布了解决方案
Imports System.Xml
Imports System.Xml.Linq
Module Module1

    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim reader As XmlReader = XmlReader.Create(FILENAME)
        Dim items As List(Of Item) = New List(Of Item)()
        While (Not reader.EOF)

            If reader.Name <> "item" Then
                reader.ReadToFollowing("Item")
            End If

            If Not reader.EOF Then

                Dim xItem As XElement = XElement.ReadFrom(reader)
                Dim item As Item = New Item()
                item.feature = xItem.Element("Feature")
                item.setting = xItem.Element("QualitySetting")

                items.Add(item)
            End If
        End While

        'using a dictionary 
        Dim doc As XDocument = XDocument.Load(FILENAME)
        Dim dict As Dictionary(Of String, String) = doc.Descendants("Item") _
            .GroupBy(Function(x) x.Element("Feature").ToString(), Function(y) y.Element("QualitySetting").ToString()) _
            .ToDictionary(Function(x) x.Key, Function(y) y.FirstOrDefault())

    End Sub

End Module
Public Class Item

    Public feature As String
    Public setting As String
End Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            List<Item> items = new List<Item>();
            while (!reader.EOF)
            {
                if(reader.Name != "item")
                {
                    reader.ReadToFollowing("Item");
                }
                if (!reader.EOF)
                {
                    XElement xItem = (XElement)XElement.ReadFrom(reader);
                    Item item = new Item() {
                        feature = (string)xItem.Element("Feature"),
                        setting = (string)xItem.Element("QualitySetting")
                    };

                    items.Add(item);
                }
            }

            //using a dictionary 
            XDocument doc = XDocument.Load(FILENAME);
            Dictionary<string, string> dict = doc.Descendants("Item")
                .GroupBy(x => (string)x.Element("Feature"), y => (string)y.Element("QualitySetting"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
    public class Item
    {
        public string feature { get; set; }
        public string setting { get; set; }
    }
}