Я пытаюсь объединить несколько XML-файлов в одном объекте XDocument.Объединить XML-файлы в XDocument
Слияние не существует в объекте XDocument. Я упустил это.
Кто-нибудь уже реализовал метод расширения слияния для XDocument или что-то подобное?
Я пытаюсь объединить несколько XML-файлов в одном объекте XDocument.Объединить XML-файлы в XDocument
Слияние не существует в объекте XDocument. Я упустил это.
Кто-нибудь уже реализовал метод расширения слияния для XDocument или что-то подобное?
Я попытался немного себя:
var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());
Я не знаю, хорошо ли это или плохо, но это работает хорошо для меня :-)
В качестве обходного пути вы можете использовать XSL-файл для объединения файлов XML, а затем преобразовать его в объект XDocument.
Будучи прагматичным, XDocument
против XmLDocument
не является все-или-ничего (если вы не на Silverlight) - так что если XmlDoucument
делает то, что вам нужно, и XDocument
не произойдет, то, возможно, использовать XmlDocument
(с ImportNode
и т.д.).
Сказанное, даже с XDocument
, вы можете использовать XNode.ReadFrom
для импорта каждого, а затем просто .Add
его в основную коллекцию.
Конечно, если файлы большие, XmlReader/XmlWriter
может быть более эффективным ... но сложнее. К счастью, XmlWriter
имеет метод WriteNode
, который принимает XmlReader
, поэтому вы можете перейти к первому ребенку в XmlReader
, а затем просто добавить его в выходной файл. Что-то вроде:
static void AppendChildren(this XmlWriter writer, string path)
{
using (XmlReader reader = XmlReader.Create(path))
{
reader.MoveToContent();
int targetDepth = reader.Depth + 1;
if(reader.Read()) {
while (reader.Depth == targetDepth)
{
writer.WriteNode(reader, true);
}
}
}
}
Объединить все файлы XML от источника до одного XDocument
public static XDocument MergeDir(string xmlDir)
{
XDocument xdoc = XDocument.Parse("<root></root>");
System.IO.DirectoryInfo directory = new DirectoryInfo(xmlDir);
if (directory.Exists)
{
foreach (System.IO.FileInfo file in directory.GetFiles())
{
if (file.Extension == ".xml")
{
xdoc.Root.Add(XDocument.Load(file.FullName).Root.Elements());
}
}
}
return xdoc;
}
Спасибо. Извините, я ненавижу XSL. Я определенно предпочел бы решение на основе кода C#. – Larry 2008-11-11 08:24:26
Нет проблем, я понимаю, как избежать XSL, поскольку иногда это может быть очень запутанным. – schnaader 2008-11-11 08:32:32