Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于C语言中的某些条件选择xml节点及其子节点的值_C#_Xml_Linq_Xpath - Fatal编程技术网

C# 基于C语言中的某些条件选择xml节点及其子节点的值

C# 基于C语言中的某些条件选择xml节点及其子节点的值,c#,xml,linq,xpath,C#,Xml,Linq,Xpath,我需要根据另一个节点值满足的条件获取节点值 这是我正在搜索的xml示例: <Elements> <Element> <ElementID>A1</ElementID> <ElementName>Element A</ElementName> <ElementValues> <ElementValue> <ValueText>A

我需要根据另一个节点值满足的条件获取节点值

这是我正在搜索的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,则结果应为一个值。类似于:如果ElementID=A1,则获取ValueText.Value 请帮我解决这个问题,Linq,XPath,随便什么…,我只是在兜圈子,一事无成

提前谢谢


我确实搜索了答案,但没有找到类似的答案…

如果我是对的,您可以使用XPath表达式

//Element[ElementID/text() = \"B1\"]
它将搜索XML文档中的每个节点,并选择那些具有子节点的节点,该子节点还具有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和LINQtoXML提供了一种使用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;