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; }
}
}
这是一些 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; }
}
}