Я формулирую xmlnodes из цикла. так что он делает
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 с корневым узлом и объявлением в конце цикла.
Я попробовал следующую концепцию, но мне не повезло, потому что она ограничивает меня тем, что я не могу записывать корневые элементы на писатель.
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);
}
}
WriteStartDocument
не создает для вас волшебным образом корневой узел). - person Alexei Levenkov   schedule 20.05.2015XmlSerializer
для потоковой передачи всего списка фрагментами, загружаемыми по запросу. См. здесь пример того, как это сделать: of-objects-to-avoid" title="используйте c Sharp xmlserializer для записи в куски для больших наборов объектов, которых следует избегать"> stackoverflow.com/questions/28837438/ - person dbc   schedule 20.05.2015Person
по частям, который вы вызываете несколько раз, верно? На что это похоже? - person dbc   schedule 20.05.2015async/await
юнитами. Это не соответствует моему предыдущему решению, которое загружает содержимое списка по запросу изXmlSerializer
. Можно ли сделать всю операцию одной большой задачей? - person dbc   schedule 20.05.2015