【问题标题】:XMLReader - How to read this element/node patternXMLReader - 如何读取此元素/节点模式
【发布时间】:2018-08-25 22:53:47
【问题描述】:

这是我需要能够阅读的一些 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

愿意以其他方式执行此操作,如果没有简单的方法可以执行此操作,我很高兴只需找到具有适当名称的 &lt;Feature&gt; 元素,然后只需读取下一个节点,但我想我会问,因为我一直想提高我的 XML 编辑知识。

【问题讨论】:

    标签: xml xmlreader


    【解决方案1】:

    下面的代码结合使用了 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; }
        }
    }
    

    【讨论】:

    • 嗨,谢谢@jdweng,这绝对完美。也感谢您再次发布它,并将其更改为符合我的措辞。这很难谷歌,所以我真的很感激。如果我再打扰你一次,我发现很难弄清楚如何使用它来写入值到 XML 中的相同元素。你有任何代码吗? VB.NET 很好
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多