2016-10-26 64 views
0

我已經使用xml序列化器將數據集內容導出到xml。在一個單獨的項目(PCL項目)。我正在嘗試使用Xdocuments Descendants將xml文件讀入對象類,但它沒有返回任何值。從xml.Descendants加載數據返回空值

我是否在xml文檔中缺少XNamespace的內容?

Stream stream = assembly.GetManifestResourceStream("FatForWeightLossApp.Resources.IngredientExport.xml"); 
XDocument xml = XDocument.Load(stream); 
Ingredient model = new Ingredient(); 
XNamespace ns = "http://tempuri.org/FatForWeightLossDataSet.xsd"; 
var ingredient = from r in xml.Descendants(ns + "IngredientTableDataTable") 
      select new 
      { 
       Id = r.Element("Id").Value, 
       Name = r.Element("Name").Value, 
       Calories = r.Element("Calories").Value, 
       Carbs = r.Element("Carbs").Value, 
       Fat = r.Element("Fat").Value, 
       Protein = r.Element("Protein").Value, 
       Cholesterol = r.Element("Cholesterol").Value, 
       Sodium = r.Element("Sodium").Value, 
       Sugars = r.Element("Sugars").Value, 
       Fibre = r.Element("Fibre").Value, 
       Type = r.Element("Grams").Value 
      }; 

foreach (var i in ingredient) 
{ 
    model.Id = Convert.ToInt32(i.Id); 
    model.Name = i.Name; 
    model.Calories = Convert.ToInt32(i.Calories); 
    model.Carbs = Convert.ToInt32(i.Carbs); 
    model.Fat = Convert.ToInt32(i.Fat); 
    model.Protein = Convert.ToInt32(i.Protein); 
    model.Cholesterol = Convert.ToInt32(i.Cholesterol); 
    model.Sodium = Convert.ToInt32(i.Sodium); 
    model.Sugars = Convert.ToInt32(i.Sugars); 
    model.Fibre = Convert.ToInt32(i.Fibre); 
    model.Type = i.Type; 

    database.Insert(model); 
}    
<?xml version="1.0" encoding="utf-8"?> 
<IngredientTableDataTable> 
    <xs:schema id="FatForWeightLossDataSet" targetNamespace="http://tempuri.org/FatForWeightLossDataSet.xsd" xmlns:mstns="http://tempuri.org/FatForWeightLossDataSet.xsd" xmlns="http://tempuri.org/FatForWeightLossDataSet.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"> 
    <xs:element name="FatForWeightLossDataSet" msdata:IsDataSet="true" msdata:MainDataTable="http_x003A__x002F__x002F_tempuri.org_x002F_FatForWeightLossDataSet.xsd_x003A_IngredientTable" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="IngredientTable"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="Id" type="xs:int" /> 
       <xs:element name="Name"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:maxLength value="50" /> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       <xs:element name="Calories" type="xs:decimal" /> 
       <xs:element name="Carbs" type="xs:decimal" /> 
       <xs:element name="Fat" type="xs:decimal" /> 
       <xs:element name="Protein" type="xs:decimal" /> 
       <xs:element name="Cholesterol" type="xs:decimal" /> 
       <xs:element name="Sodium" type="xs:decimal" /> 
       <xs:element name="Sugars" type="xs:decimal" /> 
       <xs:element name="Fibre" type="xs:decimal" minOccurs="0" /> 
       <xs:element name="Tbsp" type="xs:decimal" minOccurs="0" /> 
       <xs:element name="Cups" type="xs:decimal" minOccurs="0" /> 
       <xs:element name="Grams" type="xs:decimal" minOccurs="0" /> 
       <xs:element name="Qty" type="xs:decimal" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
     <xs:unique name="Constraint1" msdata:PrimaryKey="true"> 
     <xs:selector xpath=".//mstns:IngredientTable" /> 
     <xs:field xpath="mstns:Id" /> 
     </xs:unique> 
    </xs:element> 
    </xs:schema> 
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <FatForWeightLossDataSet xmlns="http://tempuri.org/FatForWeightLossDataSet.xsd"> 
     <IngredientTable diffgr:id="IngredientTable1" msdata:rowOrder="0"> 
     <Id>1</Id> 
     <Name>Natural Yoghurt</Name> 
     <Calories>103.00</Calories> 
     <Carbs>7.00</Carbs> 
     <Fat>6.00</Fat> 
     <Protein>0.00</Protein> 
     <Cholesterol>0.00</Cholesterol> 
     <Sodium>0.00</Sodium> 
     <Sugars>0.00</Sugars> 
     <Fibre>0.00</Fibre> 
     <Grams>100.00</Grams> 
     </IngredientTable> 

回答

0

你引用錯誤的元素的集合。您的代碼是指在命名空間中的IngredientTableDataTable,其中不是。您正在查找的數據似乎位於IngredientTable節點中,並且全部位於名稱空間中。你應該這樣做:

XNamespace ns = "http://tempuri.org/FatForWeightLossDataSet.xsd"; 
var ingredients = 
    from i in doc.Descendants(ns + "IngredientTable") 
    select new 
    { 
     Id = (int)i.Element(ns + "Id"), 
     Name = (string)i.Element(ns + "Name"), 
     Calories = (decimal)i.Element(ns + "Calories"), 
     Carbs = (decimal)i.Element(ns + "Carbs"), 
     Fat = (decimal)i.Element(ns + "Fat"), 
     Protein = (decimal)i.Element(ns + "Protein"), 
     Cholesterol = (decimal)i.Element(ns + "Cholesterol"), 
     Sodium = (decimal)i.Element(ns + "Sodium"), 
     Sugars = (decimal)i.Element(ns + "Sugars"), 
     Fibre = (decimal)i.Element(ns + "Fibre"), 
     Grams = (decimal)i.Element(ns + "Grams"), 
    }; 
+0

對!是的,我對此感到困惑。當我回到家時我會這樣。謝謝 :-) – TallManCycles