首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用xpath从xml获取子节点值

使用xpath从xml获取子节点值
EN

Stack Overflow用户
提问于 2018-06-27 17:46:04
回答 4查看 71关注 0票数 0
代码语言:javascript
运行
复制
    <Demo_Test>
      <Step ID="1">
        <ACTION>Point</ACTION>
        <CLASS_ID>dfsfsdf</CLASS_ID>
      </Step>
    <Step ID="2">
        <ACTION>Point</ACTION>
        <CLASS_ID>Avkddd</CLASS_ID>
      </Step>
    <Step ID="3">
        <ACTION>Point</ACTION>
        <CLASS_ID>afsasfa</CLASS_ID>
      </Step>
   <Step ID="4">
        <ACTION>SubAction</ACTION>
        <CLASS_ID>afsasfa</CLASS_ID>
      </Step>
    </Demo_Test>

我想修改"CLASS_ID“的值,"Action”节点的值是"Point“,这是我在下面写的代码,但不起作用

代码语言:javascript
运行
复制
 string l_xPath = "//Step/ACTION["Point"]";
 XmlNodeList l_nodeList = l_doc.SelectNodes(l_xPath);
EN

回答 4

Stack Overflow用户

发布于 2018-06-27 18:06:49

我使用xml linq将结果放入字典中

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<int, string> dict = doc.Descendants("Step")
                .Where(x => (string)x.Element("ACTION") == "Point")
                .GroupBy(x => (int)x.Attribute("ID"), y => (string)y.Element("CLASS_ID"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }

    }

}
票数 0
EN

Stack Overflow用户

发布于 2018-06-27 18:09:42

您可以使用以下命令:

代码语言:javascript
运行
复制
        var l_nodeList = l_doc.SelectNodes("//Step[ACTION='Point']");
        foreach (XmlNode item in l_nodeList)
        {
            Console.WriteLine(item.SelectSingleNode("CLASS_ID").InnerText);
        }

但我更喜欢jdweng的答案

票数 0
EN

Stack Overflow用户

发布于 2018-06-27 18:10:23

首先,您需要一个如下所示的对象:

代码语言:javascript
运行
复制
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="Step")]
    public class Step {
        [XmlElement(ElementName="ACTION")]
        public string ACTION { get; set; }
        [XmlElement(ElementName="CLASS_ID")]
        public string CLASS_ID { get; set; }
        [XmlAttribute(AttributeName="ID")]
        public string ID { get; set; }
    }

    [XmlRoot(ElementName="Demo_Test")]
    public class Demo_Test {
        [XmlElement(ElementName="Step")]
        public List<Step> Step { get; set; }
    }

}

然后,您可以使用此方法对xml进行反序列化:

代码语言:javascript
运行
复制
public static T XmlDeserializer<T>(string xmlString)
{
    var instance = default(T);
    var xmlSerializer = new XmlSerializer(typeof(T));
    using (var stringreader = new StringReader(xmlString))
        instance = (T)xmlSerializer.Deserialize(stringreader);

    return instance;
}

然后像这样使用它:

代码语言:javascript
运行
复制
var result = XmlDeserializer<Demo_Test >("your xml string here");
var l_nodeList =result.Step[0].CLASS_ID;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51059554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档