简体   繁体   English

附加XML字符串块保存文档

[英]Append XML string block save document

I have static method CreateXml where i create xml document. 我有静态方法CreateXml,在其中创建xml文档。 i get value of node and then i want add this values to list. 我得到节点的值,然后我想将此值添加到列表。 my first append work fine, but second append dont work. 我的第一次追加工作正常,但第二次追加无效。 How it fix and maybe you know how it code clear? 如何修复,也许您知道如何清除代码? 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 is an XmlDocument , which represents an XML document. xmlXmlDocument ,它表示XML文档。 An XML document can only have a single root element, so adding more than one isn't possible. 一个XML文档只能有一个根元素,因此不能添加多个根元素。 This is most probably why your commented code 'doesn't work'. 这很可能就是您注释的代码“不起作用”的原因。

I suspect you wanted to add these elements to the Head element you create at the beginning. 我怀疑您想将这些元素添加到开始创建的Head元素中。 So a simplified version of your code: 因此,您的代码经过简化:

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

See this fiddle for a working demo. 请参阅此小提琴以获得有效的演示。

However, I'd strongly suggest you consider using the newer LINQ to XML APIs instead, as they're much easier to work with. 但是,我强烈建议您考虑使用更新的LINQ to XML API,因为它们使用起来更容易。 The same code above could be written as below: 上面的相同代码可以编写如下:

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

See this fiddle for another demo. 看到这个小提琴另一个演示。

Both result in XML like below: 两者都导致XML如下所示:

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

The problem is that you are using the library in a wrong way, one possible way of doing this is to fill DocumentElement by using the Load method then append children to it, following code should work: 问题是您以错误的方式使用库,一种可行的方式是通过使用Load方法填充DocumentElement ,然后将子代附加到它,以下代码应该可以工作:

        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>

Also note that attributes have different way of adding them check updated code. 还要注意,属性有不同的添加方式,可以检查更新的代码。

Check MSDN documetnation. 检查MSDN失效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM