繁体   English   中英

xDocument.Load返回空值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM