【问题标题】:Construction xml file: This document already has a ' DocumentElement ' node构造 xml 文件:此文档已经有一个“DocumentElement”节点
【发布时间】:2016-04-04 16:41:51
【问题描述】:

我正在尝试构建一个 .xml 格式的文件

<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>

对于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 和 Client,但是当我尝试创建订单项目时,我在 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);
    }

【问题讨论】:

  • 你为什么不使用 XmlSerialization 而不是编写 coed 来创建 xml 文件?
  • 因为是作业,我们不允许使用序列化

标签: c# xml reflection


【解决方案1】:

XML 规范只允许在文档中单个根元素AddNodeToXmlDocument() 方法中的 document.AppendChild(elemRoot) 行会引发异常,因为之前已在 SaveToFile() 方法中创建了根元素:

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

不清楚您要对错误行做什么,也许您想将 elemRoot 附加到先前创建的根元素:

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

【讨论】:

  • match.Value="Model.OrderItem" 我希望我的元素被称为OrderItem 而不是Model.OrderItem。我已经尝试过document.DocumentElement.AppendChild(elemRoot);,但我得到了同样的错误
  • 这是 This document has a ' DocumentElement ' node 的唯一可能原因,我可以从发布的代码中看到该错误。无论如何,如果您可以发布一个简化的代码,我可以轻松复制粘贴,运行并查看错误,诊断问题会容易得多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多