美好的一天!我正在尝试使用数据集解析XML子子级。问题是当它具有多个值时,它不读取“ SiteCode”。
例如:
string filePath = @"" + _clsPathIntervalSttngs.localPath + "/" + "hehe.xml";
DataSet dataSet = new DataSet()
dataSet.ReadXml(filePath, XmlReadMode.InferSchema);
// Then display informations to test
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine(table);
for (int i = 0; i < table.Columns.Count; ++i)
{
Console.Write("\t" + table.Columns[i].ColumnName.Substring(0, Math.Min(6, table.Columns[i].ColumnName.Length)));
Console.WriteLine();
}
foreach (var row in table.AsEnumerable())
{
for (int i = 0; i < table.Columns.Count; ++i)
{
Console.Write("\t" + row[i]);
}
Console.WriteLine();
}
}
这就是它的返回结果。
返回0值,然后选择产品而不是站点代码。
我哪里出错了?
答案 0 :(得分:0)
您可能必须检查代码,因为我只是采取了一些类似的方法,并更改了代码以查看您的文档层次结构。我也没有使用DataSet
。考虑以下代码:
var filePath = "<path to your file.xml>";
var xml = XDocument.Load(filePath);
var items = from item in xml.Descendants("Product").Elements()
select item.Value;
Array.ForEach(items.ToArray(), Console.WriteLine);
这应该向您显示产品下每个元素的值。如果需要整个元素,请删除LINQ查询的select子句中的.Value
。
更新
我现在打算使用匿名类型。对于文件中的每个Product元素,您将获得其中之一。
var items = from item in dataset.Descendants("Product")
select new
{
RefCode = item.Element("RefCode").Value,
Codes = string.Join(", ", item.Elements("SiteCode").Select(x => x.Value)),
Status = item.Element("Status").Value
};
Array.ForEach(items.ToArray(), Console.WriteLine);
我已将代码拼合为逗号分隔的字符串,但是您可以根据需要保留IEnumerable
或ToList
。
答案 1 :(得分:0)
使用xml Linq:
使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Text; 使用System.Xml; 使用System.Xml.Linq;
命名空间ConsoleApplication51 { 班级计划 {
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XElement doc = XElement.Load(FILENAME);
List<Product> products = doc.Descendants("Product").Select(x => new Product()
{
refCode = (string)x.Element("RefCode"),
siteCode = x.Elements("SiteCode").Select(y => (int)y).ToArray(),
status = (string)x.Element("Status")
}).ToList();
}
}
public class Product
{
public string refCode { get; set; }
public int[] siteCode { get; set; }
public string status { get; set; }
}
}