【问题标题】:How to get all different element tags from root tag using XPath如何使用 XPath 从根标签中获取所有不同的元素标签
【发布时间】:2013-08-29 15:54:59
【问题描述】:

我有以下 xml 文件

<root>
  <element1>
    <header>header1</header>
    <tag1>tag1</tag1>
    <response>
      <status>success</status>
      <Data>
        <id>d1</id>
        <test>2</test>
      </Data>
      <Beta>
        <betaid>sdsd</betaid>
        <code>123</code>
        <code>ddd</code>
      </Beta>
    </response>
  </element1>
</root>

我的问题:如何获取“响应”标签下的第一个子元素?即状态、数据和测试版。 在 C# 中使用 XPath。谢谢

我拥有的 .net 代码在这里,但它不起作用。

XPathDocument doc= new XPathDocument(XmlReaderdata);
XPathNavigator mes, Nav = doc.CreateNavigator();

foreach(XPathNavigator node in (XPathNodeIterator)Nav.Evaluate("//response/*)
{
            node.Name;
}

【问题讨论】:

    标签: c# xpath xpathnavigator


    【解决方案1】:

    这样的 XPath 查询应该可以工作:

    //response/*
    

    例如:

    var xml = @"<root> ... </root>";
    using (StringReader stream = new StringReader(xml))
    {
        XPathDocument doc= new XPathDocument(stream);
        XPathNavigator nav = doc.CreateNavigator();
        XPathNodeIterator itor = (XPathNodeIterator)nav.Evaluate("//response/*");
    
        foreach(XPathNavigator node in itor)
        {
            Console.WriteLine(node.Name);
        }
    }
    

    产生输出:

    status
    Data
    Beta
    

    【讨论】:

    • 谢谢。我试过这个,但这不起作用。这是我的代码
    • @hss 我提供了一个工作代码示例。请参阅我的更新答案。
    【解决方案2】:

    你可以使用//response:

    DTO:

    public class Response
    {
        public Response()
        {
            Data = new List<KeyValuePair<string, string>>();
            Beta = new List<KeyValuePair<string, string>>();
        }
    
        public string Status { get; set; }
        public List<KeyValuePair<string, string>> Data { get; set; }
        public List<KeyValuePair<string, string>> Beta { get; set; }
    }
    

    代码:

    var document = XDocument.Parse(data);
    
    var element = document.XPathSelectElement("//response");
    
    var response = new Response();
    response.Status = element.Element("status").Value;
    
    foreach(var dataElement in element.Element("Data").Elements())
    {
        response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value));
    }
    
    foreach(var betaElement in element.Element("Beta").Elements())
    {
        response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value));
    }
    

    编辑:部分加载

    public Response ParseResponse(XPathDocument document)
    {
        var navigator = document.CreateNavigator();
        var iterator = navigator.Select("//response");
        iterator.MoveNext();
        var responseDoc = XDocument.Parse(iterator.Current.OuterXml);
    
        var element = responseDoc.Element("response");
    
        var response = new Response();
        response.Status = element.Element("status").Value;
    
        foreach(var dataElement in element.Element("Data").Elements())
        {
            response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value));
        }
    
        foreach(var betaElement in element.Element("Beta").Elements())
        {
            response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value));
        }
    
        return response;
    }
    
    Response response;
    
    using(var reader = XmlReader.Create(stream))
    {
        var doc = new XPathDocument(reader);
        response = ParseResponse(doc);
    }
    

    【讨论】:

    • 谢谢。这是 LinqTOXML。他们是用 XPathDocument 做到这一点的方法吗?由于我的文件很大,我不想将整个 xml 数据加载到内存中。
    • 添加了一些代码来加载正在流式传输的部分文档。
    【解决方案3】:

    您是否要获取子节点的名称? 我希望这会有所帮助

    string xmlstring = "<root><element><response><status>Success</status><Data><id>1</id></Data></response></element></root>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlstring);
            XmlNode node = doc.SelectSingleNode("/root/element/response");
            XmlNodeList children = node.ChildNodes;
    
            foreach(XmlNode i in children )
            Console.WriteLine(i.Name);
    

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2012-10-01
      相关资源
      最近更新 更多