如何从元素中具有相同名称的 xml 文件中获取特定值

本文关键字:文件 xml 获取 元素 | 更新日期: 2023-09-27 18:30:32

我不知道如何从这个特定的XML文档中提取值,并且正在寻求一些帮助,因为我在xml解析方面不是很有经验。

我必须使用XDocument.Load来加载文件。

其实我正在使用

doc = XDocument.Load(uri);
challenge = GetValue(doc, "Challenge");

这没有任何问题,但是如何获得元素权利的内在值?(多个"名称")归根结底,我现在需要

Phone = x
Dial = x
HomeAuto = x
BoxAdmin = x

也有可能某些条目(电话,拨号,家庭自动,BoxAdmin)丢失。这是动态的。

这是我的 xml 文件:

<SessionInfo>
 <SID>68eba0c8cef752a7</SID>
 <Challenge>37a5fe9f</Challenge>
 <BlockTime>0</BlockTime>
 <Rights>
  <Name>Phone</Name>
  <Access>2</Access>
  <Name>Dial</Name>
  <Access>2</Access>
  <Name>HomeAuto</Name>
  <Access>2</Access>
  <Name>BoxAdmin</Name>
  <Access>2</Access>
 </Rights>
</SessionInfo>

编辑:(添加获取值方法)

public string GetValue(XDocument doc, string name)
 {
   XElement info = doc.FirstNode as XElement;
   return info.Element(name).Value;
 }

如何从元素中具有相同名称的 xml 文件中获取特定值

注意:此解决方案使用扩展方法,因此 using 指令很重要,否则您将看不到所需的函数。

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Collections.Generic;
namespace StackOverflow
{
    class Program
    {
        const string xml = "<SessionInfo><SID>68eba0c8cef752a7</SID><Challenge>37a5fe9f</Challenge><BlockTime>0</BlockTime><Rights><Name>Phone</Name><Access>2</Access><Name>Dial</Name><Access>2</Access><Name>HomeAuto</Name><Access>2</Access><Name>BoxAdmin</Name><Access>2</Access></Rights></SessionInfo>";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Parse(xml); //loads xml from string above rather than file - just to make it easy for me to knock up this sample for you
            string nameOfElementToFind = "Name";
            IEnumerable<XElement> matches = doc.XPathSelectElements(string.Format("//*[local-name()='{0}']",nameOfElementToFind));
            //at this stage you can reference any value from Matches by Index
            Console.WriteLine(matches.Count() > 2 ? "Third name is: " + matches.ElementAt(2).Value : "There less than 3 values");
            //or can loop through
            foreach (XElement match in matches)
            {
                Console.WriteLine(match.Value);
                //or if you also wanted the related access info (this is a bit loose / assumes the Name will always be followed by the related Value
                //Console.WriteLine("{0}: {1}", match.Value, match.XPathSelectElement("./following-sibling::*[1]").Value);
            }
            Console.WriteLine("Done");
            Console.ReadKey();
        }
    }
}

这里重要的一点是行IEnumerable<XElement> matches = doc.XPathSelectElements(string.Format("//*[local-name()=''{0}'']",nameOfElementToFind));string.format发生后,XPath //*[local-name()='Name'] 。 此 XPath 语句表示要查找名称为 Name 的所有节点。 local-name()函数之所以存在,是因为我们还没有说明正在使用什么模式,在这种情况下,我们想要任何名为 Name 的元素,而不管模式如何。

XmlNamespaceManager nm = new XmlNamespaceManager(new NameTable());
nm.AddNamespace("eg", "http://Example/Namespace/Replace/With/Your/Docs/Namespace");
IEnumerable<XElement> matches = document.XPathSelectElements("//eg:Name", nm);

双正斜杠表示搜索文档中的任意位置。 要将其限制为权利,您可以说/eg:SessionInfo/eg:Rights/eg:Name . 如果您不熟悉它,如果您想充分利用 XML 文档,XPath 是一种很棒的语言/必不可少。 如果您对此有任何疑问,请给我们喊话,或在线查看;那里有很棒的教程。