【问题标题】:Unable to read specific fields from XML string in C#?无法从 C# 中的 XML 字符串中读取特定字段?
【发布时间】:2018-05-13 23:55:15
【问题描述】:

我正在尝试从以下 XML 字符串中提取 url,ttype,tempTnxId,token,txnStage 的值:

 <?xml version="1.0" encoding="UTF-8"?>
    <MMP>
       <MERCHANT>
          <RESPONSE>
             <url>https://payment.xyz.com/paynetz/epi/fts</url>
             <param name="ttype">abc</param>
             <param name="tempTxnId">12319507</param>
             <param name="token">x5H9RrhgfXvamaqEl6GpY4uCoXHN%2FlEm%2BUpaaKuMQus%3D</param>
             <param name="txnStage">1</param>
          </RESPONSE>
       </MERCHANT>
    </MMP>

到目前为止,我只能使用以下代码提取带有索引的值:

 foreach (XmlNode node in doc.SelectNodes("/MMP/MERCHANT/RESPONSE/param"))
 {   
   string tempTxnId= doc.SelectNodes("/MMP/MERCHANT/RESPONSE/param")[1].InnerText;//only works with index and not name
 }

/MMP/MERCHANT/RESPONSE/param/MMP/MERCHANT/RESPONSE/ttype 不返回任何内容。

这个解决方案:Getting specified Node values from XML document 似乎不适合我。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlstring);
var result = doc.Elements("table"); ///cant find Elements, Element is is not identified by the compiler 

【问题讨论】:

  • 无法复制。使用“/MMP/MERCHANT/RESPONSE/param”获取 4 XmlElements
  • 您是否尝试过将 XDocument 与 Linq to Xml 一起使用?
  • @SaniSinghHuttunen 我想我可能错过了一些东西。我也得到了 4 个元素。但我只能使用索引doc.SelectNodes("/MMP/MERCHANT/RESPONSE/param")[1].InnerText; 而不是名称来访问值

标签: c# .net xml linq


【解决方案1】:

您评论说您cannot select by name ttype
ttype 是一个值,而不是一个名称。
元素名称为param
元素param的单个属性名称为name

如果您需要获取元素paramInnerText 属性name 等于ttype(或其他值),那么您可以执行以下操作:

var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MMP><MERCHANT><RESPONSE><url>https://payment.xyz.com/paynetz/epi/fts</url><param name=\"ttype\">abc</param><param name=\"tempTxnId\">12319507</param><param name=\"token\">x5H9RrhgfXvamaqEl6GpY4uCoXHN%2FlEm%2BUpaaKuMQus%3D</param><param name=\"txnStage\">1</param></RESPONSE></MERCHANT></MMP>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

// This gets 4 nodes.
var paramNodes = doc.SelectNodes("/MMP/MERCHANT/RESPONSE/param");
foreach (XmlElement e in paramNodes)
{
  Console.WriteLine(e.Attributes[0].Value + "=" + e.InnerText);
}

// These each get a single node.
var ttypeNode = doc.SelectSingleNode("/MMP/MERCHANT/RESPONSE/param[@name=\"ttype\"]");
var tempTxnIdNode = doc.SelectSingleNode("/MMP/MERCHANT/RESPONSE/param[@name=\"tempTxnId\"]");
var tokenNode = doc.SelectSingleNode("/MMP/MERCHANT/RESPONSE/param[@name=\"token\"]");
var txnStageNode = doc.SelectSingleNode("/MMP/MERCHANT/RESPONSE/param[@name=\"txnStage\"]");

Console.WriteLine(ttypeNode.InnerText);
Console.WriteLine(tempTxnIdNode.InnerText);
Console.WriteLine(tokenNode.InnerText);
Console.WriteLine(txnStageNode.InnerText);

【讨论】:

    【解决方案2】:

    你可以像这样按属性值选择节点(假设这是你想要做的):

            doc.SelectNodes("/MMP/MERCHANT/RESPONSE/param[@name='ttype']")
                .Cast<XmlNode>().ToList()
                .ForEach(x=>Console.WriteLine(x.InnerText));
    

    【讨论】:

      【解决方案3】:

      使用 xml linq

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      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);
      
                  var response = doc.Descendants("RESPONSE").Select(x => new {
                      url = (string)x.Element("url"),
                      ttype = x.Elements().Where(y => (string)y.Attribute("name") == "ttype").Select(z => (string)z).FirstOrDefault(),
                      tempTxnId = x.Elements().Where(y => (string)y.Attribute("name") == "tempTxnId").Select(z => (string)z).FirstOrDefault(),
                      token = x.Elements().Where(y => (string)y.Attribute("name") == "token").Select(z => (string)z).FirstOrDefault(),
                      txnStage = x.Elements().Where(y => (string)y.Attribute("name") == "txnStage").Select(z => (int)z).FirstOrDefault()
                  }).FirstOrDefault();
      
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        相关资源
        最近更新 更多