C# 需要使用Linq检索XML数据的帮助吗

C# 需要使用Linq检索XML数据的帮助吗,c#,asp.net,linq,xml-parsing,C#,Asp.net,Linq,Xml Parsing,我试图从XML文件中检索数据,并在列表中返回解析后的数据。根据我用来访问数据(元素或属性)的内容,我要么得到null(对于元素),要么得到我无法破译的东西(对于属性) XML如下所示: <DATA_RESPONSE> <HEADER> <MSGID>IS20101P:091317125610:98::34:0</MSGID> </HEADER> <DATA> <R

我试图从XML文件中检索数据,并在列表中返回解析后的数据。根据我用来访问数据(元素或属性)的内容,我要么得到null(对于元素),要么得到我无法破译的东西(对于属性)

XML如下所示:

<DATA_RESPONSE>
    <HEADER>
        <MSGID>IS20101P:091317125610:98::34:0</MSGID>
    </HEADER>
    <DATA>
        <ROW ID='IS20101P' PE_NAME='APP-029' PE_ID='4' CODE='4829' DATA='5,1,500,1'  />
        <ROW ID='IS20101P' PE_NAME='APPS-029' PE_ID='4' CODE='4829' DATA='4,1,500,1' />
        ...
    </DATA>
    <SUMMARY>
    </SUMMARY>
    <ERRORS>
    </ERRORS>
</DATA_RESPONSE>
在Linq部分中,若使用Address.Element(“ID”).Value,则返回null。 XML中没有使用名称空间

您想改用
属性(名称)
(不带
s
):

您想改用
属性(名称)
(不带
s
):


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

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

XmlDocument xmlDoc = new XmlDocument {InnerXml = sXMLString};
另外,您的
根变量从来没有被使用过,所以为了清楚起见,我删除了它

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

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


…而不是像上面那样的
Address.Attributes(“ID”)?.ToString()

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

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

XmlDocument xmlDoc = new XmlDocument {InnerXml = sXMLString};
另外,您的
根变量从来没有被使用过,所以为了清楚起见,我删除了它

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

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


…而不是像上面那样选择Address.Attributes(“ID”)?.ToString()

您没有选择属性值。在代码中选择属性。不确定您想要实现什么,但这是我对代码的修改版本,它将所有元素加载到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;
}

这是您将在数据表中得到的结果。
您没有选择属性值。在代码中选择属性。不确定您想要实现什么,但这是我对代码的修改版本,它将所有元素加载到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;
}

这是您将在数据表中得到的结果。

保罗和尤里的建议都奏效了。保罗的变化最小,而且在尤里的解决方案中,他抱怨c是剧中的一个角色!string.IsNullOrEmpty(c)。我希望我能把这两个问题都标记为解决方案,也许SOF会考虑。保罗和尤里的建议都奏效了。保罗的变化最小,而且在尤里的解决方案中,他抱怨c是剧中的一个角色!string.IsNullOrEmpty(c)。我希望我能将两者都标记为解决方案,也许SOF会考虑。
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;