c# - 附加XML字符串 block 保存文档

标签 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));

}

最佳答案

xml 是一个 XmlDocument,它表示 XML 文档。 XML 文档只能有一个根元素,因此不可能添加多个根元素。这很可能就是您的注释代码“不起作用”的原因。

我怀疑您想将这些元素添加到您在开始时创建的 Head 元素中。所以你的代码的简化版本:

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一个工作演示。

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

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

参见this fiddle另一个演示。

两者都会产生如下所示的 XML:

<Head>
  <Unique_identifier>1</Unique_identifier>
  <Document_date>2019-01-01</Document_date>
  <Document_number>2</Document_number>
</Head>

关于c# - 附加XML字符串 block 保存文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54554950/

相关文章:

c# - EntityContainer 名称必须是唯一的。已定义名称为 'Entities' 的 EntityContainer

java - 针对字符串类型的 XSD nillable false 的 XML 验证

c# - 使用 C# 在 Windows 窗体上保存简单的用户首选项

c# - 尝试将参数传递给新的 EventHandler

xml - 使用 TWebBrowser 在 Vista 上像 IE 一样查看 XML

android - 当表格行中的 layout_height=wrap_content 时内容不换行

ios - 用于填充 TableViewController 的本地 XML 文件

java - Jaxb 和 StringBuffer 哪一个在 Xml 字符串创建方面具有更好的性能?

c# - 哪个是创建捕获变量/闭包的代码?

c# - 薛定谔的物体 : WPF property won't bind/update unless I check its value code-side?