nirmalVaishnav Ответов: 2

Обновите XML-файл с помощью другого XML-файла в C#


У меня есть два xml-файла.

Main.xml
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <RowNo>1</RowNo>
    <BatchMId>632</BatchMId>
    <RandomNo>513EHGPDX9GH</RandomNo>
    <ParentRandomNo>0000003</ParentRandomNo>
    <Status>6</Status>
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp>
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp>
    <Grade>A</Grade>
  </Table>
  <Table>
    <RowNo>2</RowNo>
    <BatchMId>632</BatchMId>
    <RandomNo>6S91XPK1Y8AV</RandomNo>
    <ParentRandomNo>0000004</ParentRandomNo>
    <Status>6</Status>
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp>
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp>
    <Grade>A</Grade>
  </Table>
</NewDataSet>


Change.xml
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <RowNo>1</RowNo>
    <BatchMId>632</BatchMId>
    <RandomNo>513EHGPDX9GH</RandomNo>
    <ParentRandomNo>0000003</ParentRandomNo>
    <Status>5</Status>
    <AggregrationTimestamp>09/06/2017 11:07:28 </AggregrationTimestamp>
    <CommissioningTimestamp>09/06/2017 11:07:28</CommissioningTimestamp>
    <Grade>B</Grade>
  </Table>
</NewDataSet>


В обоих файлах & lt;randomno> быть уникальным. и оба файла одинаковы, просто change.xml файл имеет некоторые значения элементов, которые обновляются.
И теперь я хочу обновить эти изменения в Main.xml файл. и нужен такой выход..

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <RowNo>1</RowNo>
    <BatchMId>632</BatchMId>
    <RandomNo>513EHGPDX9GH</RandomNo>
    <ParentRandomNo>0000003</ParentRandomNo>
    <Status>5</Status>
    <AggregrationTimestamp>09/06/2017 11:07:28 </AggregrationTimestamp>
    <CommissioningTimestamp>09/06/2017 11:07:28</CommissioningTimestamp>
    <Grade>B</Grade>
  </Table>
  <Table>
    <RowNo>2</RowNo>
    <BatchMId>632</BatchMId>
    <RandomNo>6S91XPK1Y8AV</RandomNo>
    <ParentRandomNo>0000004</ParentRandomNo>
    <Status>6</Status>
    <AggregrationTimestamp>08/06/2017 1:07:28 </AggregrationTimestamp>
    <CommissioningTimestamp>06/06/2017 17:26:31</CommissioningTimestamp>
    <Grade>A</Grade>
  </Table>
</NewDataSet>


У меня есть минимум 500000 записей в этом файле.
И я хочу обновить этот xml-файл без использования каких-либо циклов в c#

Если у кого-то есть идея по этому поводу, пожалуйста, дайте мне решение для этого.

Что я уже пробовал:

Я попробовал использовать for loop, но его обновление займет гораздо больше времени.
Так что, если у кого-то есть идея без петель, поделитесь со мной.
Спасибо

2 Ответов

Рейтинг:
2

Graeme_Grant

У вас есть очень большой объем данных с несколькими группами узлов. У вас есть два варианта:
1. обработайте XML как фрагмент текста
2. петля через группы узлов.

Судя по объему данных, вы можете столкнуться с проблемами памяти, поэтому вариант 2 будет наиболее жизнеспособным выбором.

Я работал с очень большими XML-файлами, некоторые из которых были слишком большими для загрузки в память. Итак, у меня есть вспомогательный класс, который я использую, чтобы пройти через входной файл и разбить его на более мелкие куски. Ваш файл имеет очень похожий формат, но очень разные данные,но вы можете воспользоваться этим процессом.

public static class XmlHelper
{
    public static IEnumerable<XElement> ElementReader(string inputUri, string elementName)
    {
        using (XmlReader reader = XmlReader.Create(inputUri))
        {
            reader.MoveToContent();
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element
                    && reader.Name == elementName
                    && (XNode.ReadFrom(reader) is XElement el))
                {
                    yield return el;
                }
            }
        }
    }
}

Поскольку он загружает только одну группу узлов за раз, время, необходимое для загрузки и декодирования, является быстрым, поэтому обработка выполняется быстро.

Использовать:
var inputXmlFilename = "input.xml";
foreach (var el in XmlHelper.ElementReader(inputXmlFilename, "Table"))
{
    // process and save
}


Рейтинг:
1

radha patil

привет попробуй это

void undosample()
   {
       string prexmlfile = "";
       string xmlfilePath = "";
       prexmlfile = Server.MapPath("xml/sampleprev.xml");
       xmlfilePath = Server.MapPath("xml/sample.xml");

       XmlDocument xdoc = new XmlDocument();
       XmlDocument xdoc1 = new XmlDocument();


       if (!File.Exists(prexmlfile.Trim()))
       {
           string xmlContent = "";
           StreamWriter sw = new StreamWriter(prexmlfile.Trim(), false, System.Text.Encoding.Default);
           xdoc.Load(xmlfilePath.Trim());
           xmlContent = xdoc.InnerXml;
           sw.Write(xmlContent.Trim());
           sw.Close();

       }
       else
       {
           xdoc1.Load(prexmlfile.Trim());
           string oldContent = xdoc1.InnerXml;
           xdoc.Load(xmlfilePath.Trim());
           xdoc.InnerXml = oldContent;

           xdoc.Save(xmlfilePath.Trim());
           xdoc1.Save(prexmlfile.Trim());
       }
   }