Я формулирую xmlnodes из цикла. так что это делаетСформулировать хорошо сформированный xml из фрагментов Xml, используя C#
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
foreach (Person human in bar)
{
var serializer = new XmlSerializer(typeof(Person));
using (var stream = new FileStream(filepath, FileMode.Append))
using (var writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, human, ns);
}
}
Он формулирует фрагменты XML, когда цикл выполняется вывод XML, как это
<Person>
<Name>mar8a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar1a</Name>
<Age>1</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar2a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar3a</Name>
<Age>1</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person><Person>
<Name>mar4a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar5a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar6a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar7a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
<Person>
<Name>mar8a</Name>
<Age>11</Age>
<Sex>MALE</Sex>
<Address>TOP 92 BOTTOM</Address>
<SingleYn>false</SingleYn>
</Person>
проблема я бегу через то, как изменить его и сделать его аа хорошо сформированный xml с корневым узлом и объявление в конце цикла.
ive попробовал следующую концепцию, но не повезло, потому что это ограничивает меня отсутствием корневых элементов на писателе.
StringBuilder output = new StringBuilder();
XmlReaderSettings ws = new XmlReaderSettings();
ws.ConformanceLevel = ConformanceLevel.Fragment;
String xmlString =
@"<Item>test with a child element stuff</Item>
<Item>test with a child element stuff</Item>";
// Create an XmlReader
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString), ws))
{
XmlWriterSettings ws2 = new XmlWriterSettings();
ws2.Indent = true;
using (XmlWriter writer = XmlWriter.Create(output, ws2))
{
writer.WriteStartDocument();
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
writer.WriteEndDocument();
}
}
Обновление !!
вот код, который сериализация списка моей реализации сериализатора
public static async Task WriteXMLAsync<T>(this List<T> listRows, T entity, VMEXPORT[] arrVmExport, string filePath)
where T : class
{
XmlWriterSettings Xmlsettings = new XmlWriterSettings();
Xmlsettings.Indent = true;
Xmlsettings.OmitXmlDeclaration = false;
Xmlsettings.NewLineOnAttributes = true;
Xmlsettings.Async = true;
Xmlsettings.Encoding = Encoding.UTF8;
Xmlsettings.CheckCharacters = false;
XmlAttributeOverrides Xmloverrides = new XmlAttributeOverrides();
XmlAttributes Xmlattribs = new XmlAttributes();
Xmlattribs.XmlIgnore = true;
Xmlattribs.XmlElements.Add(new XmlElementAttribute("SfiObjectState"));
Xmloverrides.Add(typeof(T), "SfiObjectState", Xmlattribs);
if (!File.Exists(filePath))
{
using (var fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 4096, true))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<T>), Xmloverrides);
using (XmlWriter xmlWriter = XmlWriter.Create(fileStream, Xmlsettings))
{
serializer.Serialize(xmlWriter, listRows);
await xmlWriter.FlushAsync();
}
}
}
else
{
using (var fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None, 4096, true))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<T>), Xmloverrides);
using (XmlWriter xmlWriter = XmlWriter.Create(fileStream, Xmlsettings))
{
serializer.Serialize(xmlWriter, listRows);
await xmlWriter.FlushAsync();
}
}
}
}
И Вот что итерация по методе, описанной выше, реализующим взять и пропустить
public async Task WriteXmlDataAsync<TEntity>(IQueryable<TEntity> listToWrite, [DataSourceRequest]DataSourceRequest dataRequest,
int countno, VMEXPORT[] vmExportarr, CancellationToken token,
TEntity entity, string csvFileNametx, string XmlFilePathtx)
where TEntity : class
{
dataRequest.GroupingToSorting();
int datapageno = (countno/GeneralConst.L_MAX_EXPORT_REC) + 1;
for (int ctrno = 1; ctrno <= datapageno;)
{
if (token.IsCancellationRequested)
{
RemoveTask(csvFileNametx);
token.ThrowIfCancellationRequested();
}
dataRequest.Page = ctrno;
dataRequest.PageSize = GeneralConst.L_MAX_EXPORT_REC;
var dataSourceResult = listToWrite.ToDataSourceResult(dataRequest);
await dataSourceResult.Data.Cast<TEntity>().ToList().WriteXMLAsync(entity, vmExportarr, XmlFilePathtx);
ctrno = ctrno + 1;
int percentageno = (ctrno * 100)/datapageno;
if (percentageno > 100) percentageno = 100;
UpdateTask(csvFileNametx, percentageno);
}
}
Не можете ли вы просто написать весь список в XML (возможно, вам нужно добавить класс-оболочку, чтобы иметь нужный вам корневой элемент)? –
Мне нужно добавить фрагменты xml в пакетном режиме.(соображения масштабируемости), делающие фрагменты асинхронно, чтобы добавить несколько сотен записей по очереди. если я напишу весь список в моем сценарии, он будет иметь несколько корневых элементов. –
XML, вероятно, не самый лучший формат для данных, которые вы пытаетесь сохранить, чем ... Во всяком случае, ваш образец не записывает корневой узел любого типа ('WriteStartDocument' does not волшебным образом создайте для вас корневой узел). –