【问题标题】:how to concatenate two XML string into single valid XML [duplicate]如何将两个 XML 字符串连接成一个有效的 XML [重复]
【发布时间】:2016-02-19 03:48:12
【问题描述】:

我正在尝试连接两个字符串生成器,每个都包含 XML。 当我单独添加header 时,它可以正常工作.. 与details 相同,但是当我附加...并将它们保存到数据库时,它会给我一个错误..

这是错误:

{"XML 解析:第 1 行,字符 418,text/xmldecl 不在输入开头"}

 public string XMLDoc(SalesForecastModel model)
        {
            string doc = string.Empty;

            StringBuilder builder = new StringBuilder();
            using (XmlWriter writer = XmlWriter.Create(builder))
            {
                writer.WriteStartDocument();

                writer.WriteStartElement("header");

                writer.WriteStartElement("SalesForecast");

                writer.WriteStartElement("EntryNumber");
                writer.WriteString(model.EntryNumber.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("EntryDate");
                writer.WriteString(model.EntryDate.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("Year");
                writer.WriteString(model.Year.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("Remarks");
                writer.WriteString(model.Remarks.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("RevisionID");
                writer.WriteString(model.RevisionID.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("Status");
                writer.WriteString(model.Status.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("CreatedBy");
                writer.WriteString(model.CreatedBy.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("CreatedDate");
                writer.WriteString(model.CreatedDate.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("LastModifiedBy");
                writer.WriteString(model.LastModifiedBy.ToString());
                writer.WriteEndElement();

                writer.WriteStartElement("LastModifiedDate");
                writer.WriteString(model.LastModifiedDate.ToString());
                writer.WriteEndElement();

                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteEndDocument();

            }



            StringBuilder builder1 = new StringBuilder();
            using (XmlWriter writer1 = XmlWriter.Create(builder1))
            {
                writer1.WriteStartDocument();
                writer1.WriteStartElement("details");
                foreach (SalesForecastDetailModel detail in model.Details)
                {
                    writer1.WriteStartElement("SalesForecastDetails");
                    writer1.WriteStartElement("MonthID");
                    writer1.WriteString(detail.MonthID.ToString());
                    writer1.WriteEndElement();
                    writer1.WriteEndElement();
                }
                writer1.WriteEndElement();
                writer1.WriteEndDocument();
            }
            return doc = builder.Append(builder1).ToString();
        }

【问题讨论】:

  • 95% 的答案是stackoverflow.com/questions/982597/…。您可以计算其余部分并发布自我回答(或重复投票)。
  • 您并没有尝试连接两个 StringBuilder。您正在尝试合并两个恰好包含在 StringBuilders 中的 XML 文档。这是一个与你所问的完全不同的问题,而且我很确定以前曾在这里问过一个问题。您可以尝试搜索 combine XML contentinsert XML nodes

标签: c# xml stringbuilder


【解决方案1】:

使用 XmlWriter

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication78
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string doc = string.Empty;

            StringBuilder builder = new StringBuilder();
            using (XmlWriter writer = XmlWriter.Create(builder))
            {
                XElement salesForecast =
                    new XElement(
                        "SalesForecast",
                        new XElement(
                            "header",
                            new XElement("EntryNumber", model.EntryNumber),
                            new XElement("EntryDate", model.EntryDate),
                            new XElement("Year", model.Year),
                            new XElement("Remarks", model.Remarks),
                            new XElement("RevisionID", model.RevisionID),
                            new XElement("Status", model.Status),
                            new XElement("CreatedBy", model.CreatedBy),
                            new XElement("CreatedDate", model.CreatedDate),
                            new XElement("LastModifiedBy", model.LastModifiedBy),
                            new XElement("LastModifiedDate", model.LastModifiedDate)),
                        new XElement(
                            "details",
                            model.Details.Select(detail =>
                                new XElement(
                                    "SalesForecastDetails",
                                    new XElement("MonthID", detail.MonthID)))));
                writer.WriteNode(salesForecast);

                writer.WriteEndDocument(); //closes any open tags
            }

        }
    }
}

【讨论】:

    【解决方案2】:

    您正在尝试将两个有效的 XML 文档连接在一起。这不会创建有效的 XML 文档。

    就像你有<a>x</a>(有效的XML)和<b>y</b>(有效的XML),然后像<a>x</a><b>y</b>无效 XML)一样加入他们。

    您需要用新的父节点围绕它们或将一个嵌套在另一个中。我将假设一个新的父节点。

    现在,考虑到结构可以移动,我认为有一个非常好的输出格式。我还将使用System.Xml.Linq,因为它生成的代码更易于阅读。

    试试这个:

    public string XMLDoc(SalesForecastModel model)
    {
        var xml =
            new XElement(
                "SalesForecast",
                new XElement(
                    "header",
                    new XElement("EntryNumber", model.EntryNumber),
                    new XElement("EntryDate", model.EntryDate),
                    new XElement("Year", model.Year),
                    new XElement("Remarks", model.Remarks),
                    new XElement("RevisionID", model.RevisionID),
                    new XElement("Status", model.Status),
                    new XElement("CreatedBy", model.CreatedBy),
                    new XElement("CreatedDate", model.CreatedDate),
                    new XElement("LastModifiedBy", model.LastModifiedBy),
                    new XElement("LastModifiedDate", model.LastModifiedDate)),
                new XElement(
                    "details",
                    model.Details.Select(detail =>
                        new XElement(
                            "SalesForecastDetails",
                            new XElement("MonthID", detail.MonthID)))));
    
        return xml.ToString();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2020-02-27
      • 2015-06-18
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多