【问题标题】:How to fetch values from XML and iterate to store in variable如何从 XML 中获取值并迭代以存储在变量中
【发布时间】:2018-12-25 20:42:38
【问题描述】:

我有以下格式的 XML。

<TxLife>
  <Policy>
    <PolNumber>BB1062632</PolNumber>
    <FirstName>EWAN</FirstName>
    <LastName>MCKENZIE</LastName>
    <BirthDate>1972-03-08</BirthDate>
    <MailType>ABC</MailType>
  </Policy>
  <Policy>
    <PolNumber>BB1234567</PolNumber>
    <FirstName>TEST</FirstName>
    <LastName>ONE</LastName>
    <BirthDate>1972-03-08</BirthDate>
    <MailType>DEF</MailType>
 </Policy>
</TxLife>

我已经编写了代码来使用以下代码获取字符串数组中的值:

 string[] arr = doc.Descendants("PolNumber").Select(element => element.Value).ToArray();

但不确定如何获取单个值并存储在变量中

【问题讨论】:

标签: c# xml


【解决方案1】:

选项 1:反序列化

您可以反序列化对象并存储值,而不是使用 Linq To XML。

var serializer = new XmlSerializer(typeof(TxLife));
using (TextReader reader = new StringReader(strXml))
{
    var result = (TxLife)serializer.Deserialize(reader);
}

TxLife 定义为

[XmlRoot(ElementName="Policy")]
public class Policy 
{
    [XmlElement(ElementName="PolNumber")]
    public string PolNumber { get; set; }
    [XmlElement(ElementName="FirstName")]
    public string FirstName { get; set; }
    [XmlElement(ElementName="LastName")]
    public string LastName { get; set; }
    [XmlElement(ElementName="BirthDate")]
    public string BirthDate { get; set; }
    [XmlElement(ElementName="MailType")]
    public string MailType { get; set; }
}

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

选项 2:Linq To Xml

如果你想坚持 Linq To Xml,你可以使用

var root = XElement.Parse(strXml);
var policies = new List<Policy>();
foreach(var item in root.Descendants("Policy"))
{
    policies.Add(new Policy
    {
     PolNumber= item.Element("PolNumber").Value,
     FirstName = item.Element("FirstName").Value,
     LastName = item.Element("LastName").Value,
     BirthDate = item.Element("BirthDate").Value,
      MailType = item.Element("MailType").Value
    });
}

【讨论】:

  • 谢谢。我将使用 LinQ。对于语句 strXML ,我需要放置 XML 标记吗?
  • XmlTags?抱歉没看懂你。您是说元素名称吗?
【解决方案2】:

与其将 Anu 解决方案与 for 循环一起使用,不如将 linq 与 select 一起使用,这样更有效。当元素不存在时,值也会产生问题,因此转换为字符串会更好。见下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string connStr = "Enter your connection string here";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "WB_SetNotification";  //stored procdure name

            SqlParameter policyNumber = cmd.Parameters.Add(new SqlParameter("@PolicyNumber", SqlDbType.VarChar, 20));
            cmd.Parameters.Add(policyNumber);
            cmd.Parameters["@PolicyNumber"].Direction = ParameterDirection.Input;

            SqlParameter firstName = cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.VarChar, 50));
            cmd.Parameters.Add(firstName);
            cmd.Parameters["@FirstName"].Direction = ParameterDirection.Input;

             SqlParameter lastName = cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.VarChar, 50));
            cmd.Parameters.Add(lastName);
            cmd.Parameters["@LastName"].Direction = ParameterDirection.Input;

            SqlParameter dob = cmd.Parameters.Add(new SqlParameter("@DateOfBirth", SqlDbType.DateTime));
            cmd.Parameters.Add(dob);
            cmd.Parameters["@DateOfBirth"].Direction = ParameterDirection.Input;

            XDocument doc = XDocument.Load(FILENAME);

            List<Policy> policies = doc.Descendants("Policy").Select(item => new Policy()
            {
                PolNumber = (string)item.Element("PolNumber"),
                FirstName = (string)item.Element("FirstName"),
                LastName = (string)item.Element("LastName"),
                BirthDate = (string)item.Element("BirthDate"),
                MailType = (string)item.Element("MailType")
            }).ToList();

            foreach (Policy policy in policies)
            {
                cmd.Parameters["@PolicyNumber"].Value  = policy.PolNumber;
                cmd.Parameters["@FirstName"].Value = policy.FirstName;
                cmd.Parameters["@LastName"].Value = policy.LastName;
                cmd.Parameters["@DateOfBirth"].Value = policy.BirthDate;

                cmd.ExecuteNonQuery();
            }


        }
        public class Policy
        {
            public string PolNumber { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string BirthDate { get; set; }
            public string MailType { get; set; }
        }
    }
}

【讨论】:

  • 嗨,我使用了相同的代码。它正在检索变量中的数据。现在,如果我想使用变量将数据保存在数据库中。我该怎么做。
  • 您需要更具体。什么类型的数据库?表名和列是什么?
  • 对不起。我必须通过在此列表之后调用它来发送到存储过程。
  • .[WB_SetNotification] CompanyNumber varchar(3), PolicyNumber varchar(20), DocumentType varchar(6), MailType varchar(15), DocID numeric(9), -- IMS PreAssignNTUserName varchar( 50) = '', FirstName varchar(50), LastName varchar(50), DateOfBirth 日期时间, NotificationIDPointer
  • 参见 msdn :docs.microsoft.com/en-us/dotnet/api/… 示例使用 UPDATE 查询,您需要替换为 INSERT 查询。也适用于同步:docs.microsoft.com/en-us/dotnet/api/…
猜你喜欢
  • 2013-03-14
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多