需要帮助使用Linq检索XML数据

时间:2017-10-04 19:41:05

标签: c# asp.net linq xml-parsing

我正在尝试从XML文件中检索数据并在列表中返回已解析的数据。根据我用来访问数据(元素或属性)的内容,我得到null(在Element的情况下)或者我无法解密的东西(在属性的情况下)。

XML看起来像这样:

public static Hashtable GetIDSData(string sXMLString)
{
    Hashtable result = new Hashtable();

    result.Add("Success", false);
    result.Add("ErrorMessage", "");
    result.Add("ID", "");
    result.Add("PE_NAME", "");
    result.Add("PE_ID", "");
    result.Add("CODE", "");
    result.Add("DATA", "");

    xmlDoc.InnerXml = sXMLString;
    XmlElement root = xmlDoc.DocumentElement;
    XDocument doc = XDocument.Parse(sXMLString);
    XmlNode node = xmlDoc.SelectSingleNode("DATA_RESPONSE/DATA"); 

    if (node != null)
    {
        var AddressInfoList = doc.Root.Descendants("ROW").Select(Address => new
        {
            ID = Address.Attributes("ID")?.ToString(),
            PEName = Address.Attributes("PE_NAME")?.ToString(),
            PEID = Address.Attributes("PE_ID")?.ToString(),
            Code = Address.Attributes("CODE")?.ToString(),
            Data = Address.Attributes("DATA")?.ToString(),
        }).ToList();

        foreach (var AddressInfo in AddressInfoList)
        {
            if (string.IsNullOrEmpty(AddressInfo.Code))
            {
                result["Success"] = false;
                result["ErrorMessage"] = "Invalid Code; code is empty.";
            }
            else
            {
                result["Success"] = true;
                result["ErrorMessage"] = "";
                result["ID"] = AddressInfo.ID;
                result["PE_NAME"] = AddressInfo.PEName;
                result["PE_ID"] = AddressInfo.PEID;
                result["CODE"] = AddressInfo.Code;
                result["DATA"] = AddressInfo.Data;
            }
        }
        return result;
    }

我使用以下内容获取数据。我读取文件并将XML存储在一个字符串中,并使用此字符串作为参数调用方法:

getSupportActionBar().setTitle("");

在Linq部分,如果我使用Address.Element(“ID”)。Value,我返回null。 XML中没有使用命名空间。

3 个答案:

答案 0 :(得分:2)

首先,GetIDSData()方法不按原样编译,因为在xmlDoc.InnerXml = sXMLString行,xmlDoc尚未定义。

我假设您希望xmlDoc成为XmlDocument加载sXMLString参数的内容,因此我将该行更改为:

XmlDocument xmlDoc = new XmlDocument {InnerXml = sXMLString};

此外,您的root变量从未使用过,因此我为了清楚起见将其删除了。

现在至于问题的主要部分,根据您当前的语法,您在属性的集合上调用.ToString(),这显然不是您想要的。要解决此问题,当您迭代AddressInfoList时,您想要获取属性值,如:

ID = Address.Attributes("ID")?.Single().Value

ID = address.Attribute("ID")?.Value

...而不是上面的Address.Attributes("ID")?.ToString()

答案 1 :(得分:1)

您没有选择属性值。在您的代码中,您正在选择属性。不确定你想要实现什么,但这是我修改后的代码版本,它将所有元素加载到DataTable中

public static DataTable GetIDSData(string sXMLString)
{
  DataTable result = new DataTable();

result.Columns.Add("Success");
result.Columns.Add("ErrorMessage");
result.Columns.Add("ID");
result.Columns.Add("PE_NAME");
result.Columns.Add("PE_ID");
result.Columns.Add("CODE");
result.Columns.Add("DATA");

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.InnerXml = sXMLString;
XmlElement root = xmlDoc.DocumentElement;
XDocument doc = XDocument.Parse(sXMLString);
XmlNode node = xmlDoc.SelectSingleNode("DATA_RESPONSE/DATA");

if (node != null)
{
    var AddressInfoList = doc.Root.Descendants("ROW").Select(Address => new
    {
        ID = Address.Attributes("ID").Select(i=>i.Value) ,
        PEName = Address.Attributes("PE_NAME").Select(i=>i.Value),
        PEID = Address.Attributes("PE_ID").Select(i=>i.Value),
        Code = Address.Attributes("CODE").Select(i=>i.Value),
        Data = Address.Attributes("DATA").Select(i=>i.Value),
    }).ToList();



    AddressInfoList.ForEach(e => 
    {
        e.Code.ToList().ForEach(c =>
        {
            DataRow row = result.NewRow();
            if (!string.IsNullOrEmpty(c))
            {

                row["Success"] = true;
                row["ErrorMessage"] = "";
                row["ID"] = e.ID.First();
                row["PE_NAME"] = e.PEName.First();
                row["PE_ID"] = e.PEID.First();
                row["CODE"] = e.Code.First();
                row["DATA"] = e.Data.First();

            }
            else
            {
                row["Success"] = false;
                row["ErrorMessage"] = "Invalid Code; code is empty.";
            }
            result.Rows.Add(row);

    });});
    result.Dump();
    return result;
}
return result;

}

这就是你将进入数据表的结果。 enter image description here

答案 2 :(得分:0)

ID = Address.Attributes("ID")?.ToString(),

您想要使用Attribute(name)(不使用s):

ID = Address.Attributes("ID")?.Value,