选择xml节点及其值'基于c#中的一些标准的子节点
本文关键字:子节点 标准 基于 节点 xml 选择 | 更新日期: 2023-09-27 18:08:41
我需要根据另一个节点值满足的标准获得一个节点值。
这是我正在搜索的xml示例:
<Elements>
<Element>
<ElementID>A1</ElementID>
<ElementName>Element A</ElementName>
<ElementValues>
<ElementValue>
<ValueText>A Value</ValueText>
<ValueDescription>A Type Element</ValueDescription>
</ElementValue>
</ElementValues>
</Element>
<Element>
<ElementID>B1</ElementID>
<ElementName>Element B</ElementName>
<ElementValues>
<ElementValue>
<ValueText>B Value</ValueText>
<ValueDescription>B Type Element</ValueDescription>
</ElementValue>
</ElementValues>
</Element>
</Elements>
我需要来自具有特定ElementID的节点的ValueText标记的标记值。例如:如果搜索条件是"A1",那么搜索结果应该是"A值"。(类似于:获取ValueText。如果ElementID = "A1")的值请帮我解决这个问题(Linq, XPath,随便什么…),我只是在圈子里旋转,没有任何进展。
提前感谢!
我真的一直在寻找答案,但是找不到类似的…
如果我是对的,您可以使用XPath表达式
//Element[ElementID/text() = '"B1'"]
它将搜索XML文档中的每个<Element>
节点,并选择那些具有<ElementID>
子节点的节点,该子节点另外具有text()
(内部文本)具有B1
值的属性。您可以将"B1"修改为"A1",您将获得另一个节点,只是在插入用户输入时要小心,您不希望他们能够修改完整的XPath表达式,这可能会导致漏洞。
下面是一个示例程序。
public static void Main(string[] args)
{
string xml = @"<Elements>
<Element>
<ElementID>A1</ElementID>
<ElementName>Element A</ElementName>
<ElementValues>
<ElementValue>
<ValueText>A Value</ValueText>
<ValueDescription>A Type Element</ValueDescription>
</ElementValue>
</ElementValues>
</Element>
<Element>
<ElementID>B1</ElementID>
<ElementName>Element B</ElementName>
<ElementValues>
<ElementValue>
<ValueText>B Value</ValueText>
<ValueDescription>B Type Element</ValueDescription>
</ElementValue>
</ElementValues>
</Element>
</Elements>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode root = doc.DocumentElement;
/* Select all "<Element>" nodes which have an <ElementID> subnode where the text equals "B1". */
var nodes = root.SelectNodes("//Element[ElementID/text() = '"B1'"]");
foreach(XmlNode node in nodes){
Console.WriteLine("Found matching Element: 'n {0}", node.InnerXml);
}
}
输出Found matching Element:
<ElementID>B1</ElementID><ElementName>Element B</ElementName><ElementValues><ElementValue><ValueText>B Value</ValueText><ValueDescription>B Type Element</ValueDescription></ElementValue></ElementValues>
下面是一个简单的LINQ查询:
string xml = ...;
var root = XElement.Parse(xml);
string elementID = "A1";
var result = root.Elements("Element")
.Where(e => e.Element("ElementID").Value == elementID)
.Select(e => e.Element("ElementValues").Element("ElementValue").Element("ValueText").Value)
.FirstOrDefault();
使用XML和LINQ to XML提供了一种处理XML的面向对象方法。例如,当XML最初被解析时,整个XML结构就是对象,即根。当选择节点时,每个节点都成为它自己的对象。从您的示例中,假设您已经拥有XML是一个字符串(可以是文件,或流,无论什么):
var doc = XDocument.Parse(xml);
// retrieve the parent node of A1
XElement a1 = doc.Root.Elements("Element")
.First(x => x.Element("ElementID").Value == "A1");
// a1 now has an XML structure of:
// <Element>
// <ElementID>A1</ElementID>
// <ElementName>Element A</ElementName>
// <ElementValues>
// <ElementValue>
// <ValueText>A Value</ValueText>
// <ValueDescription>A Type Element</ValueDescription>
// </ElementValue>
// </ElementValues>
// </Element>
// get the value of ValueText w/ a verbose path:
string verbosePath = a1.Element("ElementValues")
.Element("ElementValue")
.Element("ValueText").Value;
// alternatively, short-circuit the path:
string shortPath = a1.Descendants("ValueText").First().Value;
使用LINQ,将elementId
替换为您想要的值文本的元素id。
var xDoc = XDocument.Parse(xml);
var elements = xDoc.Element("Elements");
var element = elements.Elements("Element").Single(e => e.Element("ElementID").Value.Equals(elementId));
var valueText = element.Descendants("ValueText").Single().Value;