2012-03-23 3 views
1

Прежде всего: мне нужно написать заголовок документа Xml, а затем взять некоторые элементы из существующего файла Xml и поместить их в заголовок документа.пишите извлеченные Xml-элементы в Xml без дополнительных тегов.

Наконец, мне нужно разобрать некоторые объекты в один и тот же файл. Результирующий файл должен соответствовать конкретной схеме, так как он должен быть импортирован программой.

До сих пор я надеюсь, что это понятно.

Моя проблема в том:

Я написал заголовок моего документа и извлекали элементы второго документа. Но я не могу записать их в свой файл заголовка, не получая несколько ошибок при попытке загрузить их снова.

Как я уже сказал выше: мне нужны те же теги, которые я извлечил из этого второго файла, без ввода C# в некоторые дополнительные функции, такие как тег объявления.


В соответствии с поручением на странице «Как Ask» Я собираюсь попытаться резюмировать все, что я пытался сделать эту работу.

Итак, теперь для моей истории сбоев;) Код, приведенный ниже, я получил после 2 дней попытки. Я попробовал некоторые раньше, но это один, вероятно, «большинство» работает один:

XElement rootElement = XElement.Load(@filepath);     

     FileStream fs = new FileStream(@Savepath, FileMode.Append);        


     IEnumerable<XElement> elements = rootElement.Descendants("Extract1");      
     foreach (XElement item in elements) 
     { 
      Console.WriteLine(item); 
      item.Save(fs); 
     }                      


     IEnumerable<XElement> elements2 = rootElement.Descendants("Extract2"); 
     foreach (XElement item in elements2) 
     { 
      Console.WriteLine(item); 
      item.Save(fs);                      

     } 
     fs.Close(); 

Console Output звучит так:

<Extract1> 
     <childnodes /> 
</Extract1> 
<Extract2> 
    <childnodes /> 
</Extract2> 

И это именно то, что я хочу в моем файле, так что это не как я выбрал неправильные узлы. Но при сохранении в файле появляется магический ярлык объявления, а Xml выглядит так, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?> 
<Extract1> 
    <childnodes /> 
</Extract1><?xml version="1.0" encoding="UTF-8"?> 
<Extract2> 
    <childnodes /> 
</Extract2> 

Так что я не могу прочитать файлы снова.

Я попытался с

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 

также. Это убивает тег объявления, но я до сих пор не могу прочитать файл, потому что теперь этот раздел «оценивает» ошибку.

<Extract1> 
    <childnodes /> 
</Extract1><Extract2> 

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

XmlSerializer serializer = new XmlSerializer(typeof(List<XElement>)); 
      TextWriter textWriter = new StreamWriter(@savepath); 
      serializer.Serialize(textWriter, listX); 
      textWriter.Close(); 

, но теперь я получаю эти

<ArrayOfXElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<XElement> 

Подводя итог моей проблеме: есть ли способ прочитать эти узлы и «вставить» их в другой файл без добавления дополнительных тегов ?

Кстати, я думал о сохранении исходного Xml-файла и просто удалении всех узлов, которые я не хочу, но сначала это может занять много времени, так как это довольно большие Xml-файлы, а во-вторых, они частично генерируется автоматически, поэтому у меня нет каждого имени.

ответ

1

Когда вы пишете (Save()) XElement, предполагается, что вы хотите написать полный XML-документ, чтобы он добавил тег.

Лучшим решением, вероятно, является добавление их в XDocument и сохранение его сразу после его завершения.

Но короткое решение, минимальное изменение формирует текущий код:

Console.WriteLine(item); 
//item.Save(fs); 
fs.WriteLine(item.ToString()); 

Но вы будете иметь проблемы, связанные с этим с группой (корень) тегом.

Альтернативой на основе ваших listX:

var doc = new XElement("Extracts", listX); 
// add/insert/replace other elements 
doc.Save(filePath); 
+0

Спасибо большое! Альтернатива работает отлично! Это решение довольно простое, но элегантное. Должен сказать, мне стало немного стыдно, что я не придумал, что добавить в List вещь. Отличная работа! Еще раз спасибо! – ThiS