我不知道如何从这个特定的XML文档中提取值,并且正在寻找一些帮助,因为我对xml解析不是很有经验。
我必须使用XDocument.Load
来加载文件。
其实我正在使用
doc = XDocument.Load(uri);
challenge = GetValue(doc, "Challenge");
这没有任何问题,但如何获得元素权利的内在价值? (多个“姓名”) 在一天结束时,我现在需要
Phone = x
Dial = x
HomeAuto = x
BoxAdmin = x
也可能缺少某些条目(Phone,Dial,HomeAuto,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>
编辑:(添加GetValue方法)
public string GetValue(XDocument doc, string name)
{
XElement info = doc.FirstNode as XElement;
return info.Element(name).Value;
}
答案 0 :(得分:3)
注意:此解决方案使用扩展方法,因此使用指令很重要,否则您将看不到所需的功能。
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
。如果你不熟悉它,XPath是一个很棒的语言/必不可少的,如果你想充分利用XML文档。如果您对此有任何疑问,请给我们留言,或在网上浏览一下;有很棒的教程。