2016-04-04 199 views
0

我试图构造形式构建XML文件:这个文件已经有了一个 'DocumentElement' 节点

<Orders> 
    <Id type="System.Int32">1</Id> 
    <OrderItems> 
     <OrderItem> 
      <Id type="System.Int32">321</Id> 
      <Product type="System.String">Coffee</Product> 
     </OrderItem> 
    </OrderItems> 
    <Client type="System.String">Johnny</Client> 
<Orders> 

的.xml文件对于Order型号:

public class Order 
{ 
    public int Id { get; set; } 
    public List<OrderItem> Products { get; set; } 
    public string Client { get; set; } 
} 

在这里,我创建Order元素

public void SaveToFile(IEnumerable<Order> elementsList) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", string.Empty); 
     xmlDoc.PrependChild(xmlDec); 
     XmlElement elemRoot = xmlDoc.CreateElement("Orders"); 
     xmlDoc.AppendChild(elemRoot); 
     XmlHelper<Order> xmlHelper = new XmlHelper<Order>(); 
     foreach (var order in _orders) 
     { 
      xmlHelper.AddNodeToXmlDocument(xmlDoc, elemRoot, order); 
     } 
     xmlDoc.PreserveWhitespace = true; 
     xmlDoc.Save(_filePath); 
    } 

在这里,我试图构造子元素。它工作正常的ID和客户端,但是当我尝试创建订单项目,在我行收到此错误document.AppendChild(elemRoot);

public void AddNodeToXmlDocument(XmlDocument document, XmlElement rootElement, object myObject) 
    { 
     XmlElement myObjectElement = document.CreateElement(EntityFormatter.GetObjectName(myObject)); 
     foreach (var objectProperty in EntityFormatter.GetPropertiesAndValues(myObject)) 
     { 
      if ((objectProperty.Value.GetType().FullName).ToString().Contains("System.Collections.Generic.List")) 
      { 
       Regex regex = new Regex(@"Models[.][A-Za-z]+"); 
       Match match = regex.Match(objectProperty.Value.ToString()); 
       var elemRoot = document.CreateElement(match.Value.Substring(7)); 
       document.AppendChild(elemRoot); 
       foreach (var obj in objectProperty.Value.ToString()) 
       { 
        AddNodeToXmlDocument(document, elemRoot, obj); 
       } 
      } 
      else 
      { 
       var elem = document.CreateElement(objectProperty.Key); 
       elem.SetAttribute("type", objectProperty.Value.GetType().FullName); 
       elem.InnerText = objectProperty.Value.ToString(); 
       myObjectElement.AppendChild(elem); 
      } 
     } 
     rootElement.AppendChild(myObjectElement); 
    } 
+0

你为什么不使用* XmlSerialization * instaed写男女同校的创建XML文件? – bit

+0

因为它是作业,我们不允许使用序列化 – user1012732

回答

0

XML规范仅允许在文档中单根元素

..... 
XmlElement elemRoot = xmlDoc.CreateElement("Orders"); 
xmlDoc.AppendChild(elemRoot); 
..... 

目前尚不清楚你试图用错误路线做什么,也许你要追加elemRoot:因为根元素已经在SaveToFile()方法之前创建document.AppendChild(elemRoot)线在AddNodeToXmlDocument()方法抛出异常以前创建的根元素代替:

..... 
var elemRoot = document.CreateElement(match.Value.Substring(7)); 
document.DocumentElement.AppendChild(elemRoot); 
..... 
+0

'match.Value =“Model.OrderItem”'我希望我的元素被称为'OrderItem'而不是'Model.OrderItem'。我已经尝试过'document.DocumentElement.AppendChild(elemRoot);',但我得到相同的错误 – user1012732

+0

这是唯一可能的原因*此文档已经有一个'DocumentElement'节点*错误,我可以从发布的代码中看到。无论如何,如果您可以发布一个简化的代码,我可以轻松地复制粘贴,运行并查看错误,那么诊断问题会更容易 – har07

相关问题