2017-02-01 5 views
2

Hi ниже являются XML-файлов, которые мастер XMLНевозможно использовать InsertAfter для XmlDocument в C#

<?xml version="1.0" encoding="utf-16"?> 
<Verify> 
    <ver> 
    <ECU> 
     <values> 
     </values> 
    </ECU> 
    </ver> 
</Verify> 

У меня есть несколько файлов, которые имеют ту же структуру, как показано ниже

<?xml version="1.0" encoding="utf-16"?> 
<Verify> 
    <ver> 
    <ECU> 
     <values> 
     </values> 
    </ECU> 
    </ver> 
</Verify> 

Я хочу, чтобы мой выход в

<?xml version="1.0" encoding="utf-16"?> 
<Verify> 
    <ver> 
    <ECU> 
     <values> 
     </values> 
    </ECU> 

    <ECU> 
     <values> 
     </values> 
    </ECU> 

    <ECU> 
     <values> 
     </values> 
    </ECU> 
    </ver> 
</Verify> 

Я использую ниже код, чтобы прочитать первую как мастер XML и другие файлы поступательных m xmls. Я хочу добавить узел ECU из этих файлов в узле ECU главного файла.

XmlDocument xmlMaster = new XmlDocument(); 
     xmlMaster.Load(@"C:\MasterXMLFile.xml"); 
     XmlElement masterRoot = xmlMaster.DocumentElement; 
     XmlNode masterParent = masterRoot.LastChild.LastChild; 
     var downloadfolder = @"C:\AllXMLs\xmls\"; 
     string[] files = Directory.GetFiles(downloadfolder); 
     foreach (var xx in files) 
     { 
      XmlNode masterNode = masterRoot.LastChild.LastChild; 
      XmlDocument xdoc = new XmlDocument(); 
      xdoc.Load(xx); 
      XmlElement root = xdoc.DocumentElement; 
      XmlElement tempNode = (XmlElement)root.LastChild.LastChild; 
      masterRoot.InsertAfter(tempNode, masterRoot.SelectSingleNode("//ECU").ParentNode); 
     } 
     xmlMaster.Save(@"C:\mergeg.xml"); 

Я получаю ошибку в инструкции InsertAfter, поскольку ссылка объекта не установлена ​​в экземпляр объекта.

Пожалуйста, предложите мне какое-либо решение.

+1

Не ожидайте, что 'LastChild' будет выбирать узел элемента, это может быть текстовый узел. Поэтому просто выберите элемент, который вы хотите скопировать с помощью XPath и 'SelectSingleNode'. И затем убедитесь, что вы используете 'ImportNode', если хотите скопировать узел из одного документа в другой. –

ответ

2

tempNode от xdoc контекст документа. Вы должны импортировать его в xmlMaster контексте документа:

XmlNode importedECU = xmlMaster.ImportNode(tempNode, true); 

Кроме того, вместо InsertAfter лучше использовать AppendChild и добавлять новые узлы ECU как дети главного ver элемента:

var masterVer = masterRoot.SelectSingleNode("//ver"); 

foreach(var file in files) 
{ 
    var xdoc = new XmlDocument(); 
    xdoc.Load(file); 
    var tempNode = xdoc.DocumentElement.LastChild.LastChild; 
    var importedECU = xmlMaster.ImportNode(tempNode, true); 
    masterVer.AppendChild(importedECU); 
} 
0

Ваш InsertAfter должен быть на parentNode узла, который вы хотите вставить после, так что родительский элемент tempNode.

Смежные вопросы