[英]Get value of xml child node by name attribute
我正在嘗試從存儲在用戶 PC 上的 XML 文檔中提取數據。 我想提取諸如密碼、用戶名、面板加載和DemonLoad 之類的項目。
XML:
<userSettings>
<Refreshe.Properties.Settings>
<setting name="Password" serializeAs="String">
<value>aaa</value>
</setting>
<setting name="Username" serializeAs="String">
<value>bbb</value>
</setting>
<setting name="PanelLoad" serializeAs="String">
<value>False</value>
</setting>
<setting name="DemonLoad" serializeAs="String">
<value>False</value>
</setting>
<setting name="DiscordRPC" serializeAs="String">
<value>True</value>
</setting>
</Refreshe.Properties.Settings>
</userSettings>
C# 代碼:
static void getRebirthInfo()
{
var vbls = new variables();
// get list of files in root directory and all its subdirectories
string[] files = Directory.GetFiles(vbls.rootdir, "*.config", SearchOption.AllDirectories);
// get number of config files
int fileCount = files.Length;
//prints out each config fie (debugging use only)
Console.WriteLine(String.Join(Environment.NewLine, files));
//Create the XmlDocument instance
XmlDocument doc = new XmlDocument();
// load each xml doc
for (int i = 0; i < fileCount; i++)
{
doc.Load(files[i]);
var RefreshePassword = doc.DocumentElement.SelectSingleNode("Refreshe.Properties.Settings").SelectSingleNode("setting").InnerText;
}
}
我嘗試了多種方法並且遇到了麻煩。 我似乎也總是遇到同樣的錯誤......
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
Line 43
第 43 行將是
var RefreshePassword = doc.DocumentElement.SelectSingleNode("Refreshe.Properties.Settings").SelectSingleNode("setting").InnerText;
我究竟做錯了什么?
將 xml linq 與字典一起使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
Dictionary<string, string> dict = doc.Descendants("Refreshe.Properties.Settings").FirstOrDefault().Elements("setting")
.GroupBy(x => (string)x.Attribute("name"), y => (string)y.Element("value"))
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
}
}
}
要查找特定節點的值,請執行以下操作(在這種情況下獲取“密碼”):
var xml =
@"<userSettings>
<Refreshe.Properties.Settings>
<setting name=""Password"" serializeAs=""String"">
<value> aaa </value>
</setting>
<setting name=""Username"" serializeAs=""String"">
<value> bbb </value>
</setting>
<setting name=""PanelLoad"" serializeAs=""String"">
<value> False </value>
</setting>
<setting name=""DemonLoad"" serializeAs=""String"">
<value> False </value>
</setting>
<setting name=""DiscordRPC"" serializeAs=""String"">
<value> True </value>
</setting>
</Refreshe.Properties.Settings>
</userSettings>";
var xdoc=new XmlDocument();
xdoc.LoadXml(xml);
var settingName = "Password";
var xpath = $"*/setting[@name='{settingName}']/value";
var refreshPasswordElement = xdoc.DocumentElement.SelectSingleNode(xpath);
var refreshPasswordValue = refreshPasswordElement?.InnerText;
...並獲取所有設置的值,請執行以下操作:
var xpath = "*/setting";
foreach (XmlNode setting in xdoc.DocumentElement.SelectNodes(xpath))
{
var parsedSetting =
new
{
Name = setting.Attributes["name"].InnerText,
Value = setting.FirstChild.InnerText
};
//do stuff
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.