簡體   English   中英

通過名稱屬性獲取xml子節點的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM