附加XML字符串块保存文档

时间:2019-02-06 13:37:50

标签: c# xml

我有静态方法CreateXml,可在其中创建xml文档。我得到节点的值,然后我想将此值添加到列表。我的第一次追加工作正常,但第二次追加无效。如何修复,也许您知道如何清除代码? screen here

private static void CreateXml(DataReader reader)
{
    var tempServerDir = Path.Combine(tempExportDirectory, Text.GetRandomString() + ".xml");
    XmlDocument xml=new XmlDocument();
    /// <summary>
    ///Create Head xml element
    /// </summary>
    xml.CreateElement("Head");
    var uniqueIdentifier = xml.CreateElement("Unique_identifier");
    var documentDate = xml.CreateElement("Document_date");
    var documentNumber = xml.CreateElement("Document_number");
    var documentName = xml.CreateElement("Document_name");
    var vehicleId = xml.CreateElement("Vehicle_id");
    var company = xml.CreateAttribute("Company");
    var driverId = xml.CreateAttribute("Driver_id");
    var contractId=xml.CreateAttribute("Contract_id");

    /// <summary>
    ///get value of node
    /// </summary>
    uniqueIdentifier.InnerText = Text.Convert(reader.GetFieldValue<int>("uniqueIdentifier"));
    documentDate.InnerText = Text.Convert(reader.GetFieldValue<DateTime>("documentDate"));
    documentNumber.InnerText = reader.GetFieldValue<string>("documentNumber");
    documentName.InnerText = "NDMTtest";
    //documentName.InnerText = reader.GetFieldValue<string>("documentName");
    vehicleId.InnerText = Text.Convert(reader.GetFieldValue<int>("vehicleId"));
    company.InnerText = Text.Convert(reader.GetFieldValue<int>("company"));
    driverId.InnerText = Text.Convert(reader.GetFieldValue<int>("driverId"));
    contractId.InnerText = reader.GetFieldValue<string>("contractId");

    /// <summary>
    ///add values to list
    /// </summary>
    xml.AppendChild(uniqueIdentifier);
    //xml.AppendChild(documentDate);
    //xml.AppendChild(documentNumber);
    //xml.AppendChild(documentName);
    //xml.AppendChild(vehicleId);
    //xml.AppendChild(driverId);
    //xml.AppendChild(company);
    //xml.AppendChild(contractId);
    /// <summary>
    ///Create Order xml element
    /// </summary>
    xml.CreateElement("Order");
    var testOrder = xml.CreateAttribute("NPP");
    testOrder.InnerText = "TestString";
    xml.AppendChild(testOrder);
    InfoManager.MessageBox("tempServerDir4:{0}", tempServerDir);
    /// <summary>
    /// Save and send file to client from temp directory
    /// </summary>
    //xml.Save(Console.Out);
    xml.Save(tempServerDir);
    //FileManager.SendFile(tempServerDir);
    InfoManager.MessageBox(FileManager.SendFile(tempServerDir));

}

2 个答案:

答案 0 :(得分:3)

OR 3 - title3 - content3 - 2019-02-05 19:14:43 OR 3 - content3 - 2019-02-05 19:14:43 (doesn't matter) 4 - title4 - content4 - 2019-02-05 19:14:44 5 - title5 - content5 - 2019-02-05 19:14:45 4 - content4 - 2019-02-05 19:14:44 5 - content5 - 2019-02-05 19:14:45 xml,代表XML文档。一个XML文档只能有一个根元素,因此不能添加多个根元素。这很可能就是您注释的代码“不起作用”的原因。

我怀疑您想将这些元素添加到开始创建的XmlDocument元素中。因此,您的代码经过简化:

Head

有关有效的演示,请参见this fiddle

但是,我强烈建议您考虑使用更新的LINQ to XML API,因为它们更容易使用。上面相同的代码可以写成如下:

var xml = new XmlDocument();

var head = xml.CreateElement("Head");
var uniqueIdentifier = xml.CreateElement("Unique_identifier");
var documentDate = xml.CreateElement("Document_date");
var documentNumber = xml.CreateElement("Document_number");

uniqueIdentifier.InnerText = "1";
documentDate.InnerText = "2019-01-01";
documentNumber.InnerText = "2";

xml.AppendChild(head);
head.AppendChild(uniqueIdentifier);
head.AppendChild(documentDate);
head.AppendChild(documentNumber);

有关其他演示,请参见this fiddle

两个结果都如下所示:

var doc = new XDocument(
    new XElement("Head",
        new XElement("Unique_identifier", "1"),
        new XElement("Document_date", "2019-01-01"),
        new XElement("Document_number", "2")
    )
);

答案 1 :(得分:1)

问题是您使用的库方法有误,一种可行的方法是使用DocumentElement方法来填充Load,然后将子代添加到该库中,以下代码应该可以工作:

        xml.Load(new StringReader("<root></root>"));

        /// <summary>
        ///add values to list
        /// </summary>
        xml.DocumentElement.AppendChild(uniqueIdentifier);
        xml.DocumentElement.AppendChild(documentDate);
        xml.DocumentElement.AppendChild(documentNumber);
        xml.DocumentElement.AppendChild(documentName);
        xml.DocumentElement.AppendChild(vehicleId);

        //add attributes 
        xml.DocumentElement.Attributes.Append(driverId);
        xml.DocumentElement.Attributes.Append(company);
        xml.DocumentElement.Attributes.Append(contractId);

        xml.Save(Console.Out);

//output
//<root Driver_id="driverId" Company="company" Contract_id="contractId">
  //<Unique_identifier>uniqueIdentifier</Unique_identifier>
  //<Document_date>documentDate</Document_date>
  //<Document_number>documentNumber</Document_number>
  //<Document_name>NDMTtest</Document_name>
  //<Vehicle_id>vehicleId</Vehicle_id>
//</root>

还请注意,属性有不同的添加方式来检查更新的代码。

检查MSDN加密。