[英]xDocument.Load returning null?
通过调试,我可以检查Stream是否正在传递
<POS>
<Id>4</Id>
<FolderPath>C://FolderPath</FolderPath>
<Number>44</Number>
<POSTillTypeRecord>Tilltype</POSTillTypeRecord>
<StockLocationRecord>StockLocationRec</StockLocationRecord>
</POS>
至:
public XmlActionResult Upload()
{
//List<POSUnitRecord> POSs = null;
try
{
using (var up = new StreamReader(Request.InputStream))
{
POSUnitRecord POS =
(
from e in XDocument.Load(up).Root.Elements("Payment") //POS")
//select (string)e.Element("POS")
select new POSUnitRecord
{
Id = Int32.Parse((string)e.Element("Id")),
FolderPath = (string)e.Element("FolderPath"),
Number = Int32.Parse((string)e.Element("Number")),
//POSTillTypeRecord = (string)e.Element("POSTillTypeRecord"),
//StockLocationRecord = (string)e.Element("StockLocationRecord")
}
).FirstOrDefault();
POSUnitRecord POS为什么返回NULL。 与付款/ POS有关?
您的XML在根目录下没有Payment
元素。 所以你有空序列。 从空序列获取FirstOrDefault()
会为您提供null
。
我建议您直接将xml加载到XElement中:
var p = XElement.Load(reader);
var pos = new POSUnitRecord
{
Id = (int)p.Element("Id"),
FolderPath = (string)p.Element("FolderPath"),
Number = (int)p.Element("Number")
};
旁注-您可以在此处使用Xml序列化:
[XmlRoot("POS")]
public class POSUnitRecord
{
public int Id { get; set; }
public string FolderPath { get; set; }
public int Number { get; set; }
}
反序列化很简单:
using (var reader = new StreamReader(Request.InputStream))
{
XmlSerializer serializer = new XmlSerializer(typeof(POSUnitRecord));
var pos = (POSUnitRecord)serializer.Deserialize(reader);
}
您选择的“付款”元素不存在,但是有一个“ POS”元素。 此外,该元素变为Root
。 最后,无需使用Linq语法; 您可以使用XLinq提供的方法:
var xDoc = XDocument.Load(up);
var posUnitRecords = xDoc.Root.Select(e => new POSUnitRecord()
{
Id = Int32.Parse((string)e.Element("Id").Value),
FolderPath = (string)e.Element("FolderPath").Value,
Number = Int32.Parse((string)e.Element("Number").Value),
});
var firstRecord = POSUnitRecords.First();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.