我正在尝试从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中没有使用命名空间。
答案 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;
}
答案 2 :(得分:0)
ID = Address.Attributes("ID")?.ToString(),
您想要使用Attribute(name)
(不使用s
):
ID = Address.Attributes("ID")?.Value,