записывать извлеченные элементы XML в Xml без дополнительных тегов - PullRequest
1 голос
/ 24 марта 2012

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

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

Пока я надеюсь, что это понятно.

Моя проблема с этим:

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

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


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

Так что теперь для моей истории сбоев;) Код ниже - тот, который я закончил после 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();

Вывод на консоль выглядит так:

 <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>

Последнее, что я попробовал, - это запись извлеченных элементов в List 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 Ответ

1 голос
/ 24 марта 2012

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

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

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

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

Но у вас не получится окружить это тегом группы (root).

Альтернатива, основанная на вашем спискеX:

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