代码之家  ›  专栏  ›  技术社区  ›  Peter

获取:“文档将导致无效的XML文档”错误

  •  0
  • Peter  · 技术社区  · 7 年前

    我正试图将一个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)分割,每个文件包含一个 最终发票 . 然后我移动了线 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>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Alexander Petrov    7 年前

    不能将多个根元素添加到 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;
    }