简体   繁体   English

读取具有多个节点的xml文档

[英]Reading xml document with several nodes

I have used the following code before but my xml is different this time: 我之前使用过以下代码,但是这次的xml不同:

protected string ReturnXmlValue(XmlDocument myXDoc, string field)
{
  var retval = string.Empty;


  try
  {
    var node = myXDoc.GetElementsByTagName(field);
    if (node.Count > 0)
    {
      var xmlNode = node.Item(0);
      if (xmlNode != null)
      {
        retval = xmlNode.InnerText;
      }
    }
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.ToString());
    throw;
  }

  return retval;
}

Here is an example of my xml file dummied down a bit: 这是我的xml文件被删减后的示例:

<RichDBDS>
  <TrxDetailCard>
    <TRX_HD_Key>18683435</TRX_HD_Key>
    <Date_DT>2015-10-22T21:32:00.233+00:00</Date_DT>
    <TRX_Card_Key>15263569</TRX_Card_Key>
    <Total_Amt_MN>22.0000</Total_Amt_MN>
    <Result_CH>0    </Result_CH>
    <Result_Txt_VC>APPROVED</Result_Txt_VC>
    <Approval_Code_CH>0943253</Approval_Code_CH>
  </TrxDetailCard>
  <TrxDetailCard>
    <TRX_HD_Key>18683825</TRX_HD_Key>
    <Date_DT>2015-10-23T21:32:00.233+00:00</Date_DT>
    <TRX_Card_Key>15263569</TRX_Card_Key>
    <Total_Amt_MN>32.0000</Total_Amt_MN>
    <Result_CH>0    </Result_CH>
    <Result_Txt_VC>APPROVED</Result_Txt_VC>
    <Approval_Code_CH>093389</Approval_Code_CH>
  </TrxDetailCard>
</RichDBDS>

I've not worked with xml much so I'm not sure how to search this for a specific amount. 我与xml的合作不是很多,所以我不确定如何搜索xml的具体数量。 I can have several TrxDetailCards. 我可以有几个TrxDetailCard。 I know how to get amount when I only have one TrxDetailCard but I need to return the TrxDetailCard for the hits on the amount that I need. 当我只有一张TrxDetailCard时,我知道如何获得金额,但是我需要返回TrxDetailCard以获取所需金额的点击量。

So if I am looking for the TrxDetailCard that is 32.00, I need the method to return: 因此,如果我正在寻找32.00的TrxDetailCard,则需要该方法返回:

  <TrxDetailCard>
    <TRX_HD_Key>18683825</TRX_HD_Key>
    <Date_DT>2015-10-23T21:32:00.233+00:00</Date_DT>
    <TRX_Card_Key>15263569</TRX_Card_Key>
    <Total_Amt_MN>32.0000</Total_Amt_MN>
    <Result_CH>0    </Result_CH>
    <Result_Txt_VC>APPROVED</Result_Txt_VC>
    <Approval_Code_CH>093389</Approval_Code_CH>
  </TrxDetailCard>

How would I go about doing this? 我将如何去做呢?

Try this 尝试这个

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string xml = "<RichDBDS>" + "<TrxDetailCard>" + "<TRX_HD_Key>18683435</TRX_HD_Key>" + "<Date_DT>2015-10-22T21:32:00.233+00:00</Date_DT>" + "<TRX_Card_Key>15263569</TRX_Card_Key>" + "<Total_Amt_MN>22.0000</Total_Amt_MN>" + "<Result_CH>0 </Result_CH>" + "<Result_Txt_VC>APPROVED</Result_Txt_VC>" + "<Approval_Code_CH>0943253</Approval_Code_CH>" + "</TrxDetailCard>" + "<TrxDetailCard>" + "<TRX_HD_Key>18683825</TRX_HD_Key>" + "<Date_DT>2015-10-23T21:32:00.233+00:00</Date_DT>" + "<TRX_Card_Key>15263569</TRX_Card_Key>" + "<Total_Amt_MN>32.0000</Total_Amt_MN>" + "<Result_CH>0 </Result_CH>" + "<Result_Txt_VC>APPROVED</Result_Txt_VC>" + "<Approval_Code_CH>093389</Approval_Code_CH>" + "</TrxDetailCard>" + "</RichDBDS>"; XElement richDBDS = XElement.Parse(xml); XElement results = richDBDS.Elements("TrxDetailCard").Where(x => (decimal)x.Element("Total_Amt_MN") == (decimal)32.0000).FirstOrDefault(); } } }​ 

You can use Linq-to-Xml 您可以使用Linq-to-Xml

var str = File.ReadAllText(@"C:\YourDirectory\sample.xml");
XDocument xDoc = XDocument.Parse(str);

var trxNodes = xDoc.Descendants("TrxDetailCard");
var node = trxNodes.First(n => double.Parse(n.Element("Total_Amt_MN").Value) == 32.00);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM