【问题标题】:Getting: "Document would result in an invalid XML document" error获取:“文档将导致无效的 XML 文档”错误
【发布时间】:2018-07-23 08:52:39
【问题描述】:

我正在尝试将 xml 文档拆分为多个较小的文档。我想预先定义一个徽章大小(节点/文档的最大数量),然后将数据插入其中。我的 xml 数据有两种可能的结构:

<?xml version='1.0' encoding='UTF-8' ?>
<V2:EndInvoices">
  <V2:EndInvoice>
  </V2:EndInvoice>
  ...
 </V2:EndInvoices>

<?xml version='1.0' encoding='UTF-8' ?>
<tls:AkontoGroup">
  <tls:AkontoMember>
  </tls:AkontoMember>
  ...
 </tls:AkontoGroup>

现在我只关注一个案例。每个rechnungen.ToArray()[i] 元素都包含这些EndInvoice 元素之一。我能够创建 4 个文件,其中包含 20 张发票的输入文件,除以 5(batchSize = 5),每个文件包含一个 EndInvoice。然后我将batchRechnung.Add(rechnungen.ToArray()[i]); 行移出if 块,这会导致我出现错误。

public List<XDocument> createTemporaryXMLFiles(string pathToData, int batchSize)
{
    List<XDocument> batchRechnungen = new List<XDocument>();
    XDocument batchRechnung = new XDocument();
    XElement dataSource = XElement.Load(pathToData);
    IEnumerable<XElement> rechnungen = dataSource.Elements();

    for(int i = 0; i < rechnungen.ToArray().Length; i++)
    {
        if (i == 0 || (i % batchSize) == 0)
        {
            batchRechnung = new XDocument();
            batchRechnungen.Add(batchRechnung);
        }
        batchRechnung.Add(rechnungen.ToArray()[i]);

    }
    return batchRechnungen;
}

如何获得正确的 xml 文件,每个文件都包含

<V2:EndInvoices">
 batchSize x (<V2:EndInvoice></V2:EndInvoice>)
</V2:EndInvoices>

【问题讨论】:

    标签: c# xml linq for-loop linq-to-xml


    【解决方案1】:

    您不能向XDocument 添加多个根元素。这正是您编写batchRechnung.Add 时发生的情况。因此,您必须先添加根元素。然后给它添加元素。

    public List<XDocument> createTemporaryXMLFiles(string pathToData, int batchSize)
    {
        List<XDocument> batchRechnungen = new List<XDocument>();
        XElement dataSource = XElement.Load(pathToData);            
        XDocument batchRechnung = new XDocument(new XElement(dataSource.Name));
        var rechnungen = dataSource.Elements().ToArray();
    
        for (int i = 0; i < rechnungen.Length; i++)
        {
            if (i == 0 || (i % batchSize) == 0)
            {
                batchRechnung = new XDocument(new XElement(dataSource.Name));
                batchRechnungen.Add(batchRechnung);
            }
            batchRechnung.Root.Add(rechnungen[i]);
        }
        return batchRechnungen;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多