C# 需要使用Linq检索XML数据的帮助吗
我试图从XML文件中检索数据,并在列表中返回解析后的数据。根据我用来访问数据(元素或属性)的内容,我要么得到null(对于元素),要么得到我无法破译的东西(对于属性) 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
<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;