2015-08-19 2 views
1

Я пытался вставить узел xml в документ xml в определенной позиции.Вставить узел в документ xml с помощью C#

Это мой XML:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <readContract xmlns="http://implementation.company.schema.reference"> <ContactNumbers>10158</ContactNumbers> <productGroups>0085</productGroups> <indicationBalanceInfo>false</indicationBalanceInfo> <indicationBlocked>true</indicationBlocked> </readContract> </Body> </Envelope>

И пытаюсь вставить другой тег <productGroups>0093</productGroups> ниже тега <productGroups>0085</productGroups>

Ожидая как ниже:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <readContract xmlns="http://implementation.company.schema.reference"> <ContactNumbers>10158</ContactNumbers> <productGroups>0085</productGroups> <productGroups>0093</productGroups> <indicationBalanceInfo>false</indicationBalanceInfo> <indicationBlocked>true</indicationBlocked> </readContract> </Body> </Envelope>

Used ниже код C# для его достижения.

 XmlDocument doc = new XmlDocument(); 
      string inputxml = this.StServiceCallActivity5.InputEnvelope.InnerXml.ToString(); 
//Here inputxml contains whole xml document. 
      string addxml = "<productGroups>0093</productGroups>"; 
      doc.LoadXml(inputxml); 
      XmlDocumentFragment xmlDocFrag = doc.CreateDocumentFragment(); 
      xmlDocFrag.InnerXml = addxml; 
      XmlElement parentEle = doc.DocumentElement; 
      parentEle.AppendChild(xmlDocFrag); 

И это возвращает значение как <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <readContract xmlns="http://implementation.company.schema.reference"> <ContactNumbers>10158</ContactNumbers> <productGroups>0085</productGroups> <productGroups>0093</productGroups> <indicationBalanceInfo>false</indicationBalanceInfo> <indicationBlocked>true</indicationBlocked> </readContract> </Body> <productGroups xmlns="">0093</productGroups> </Envelope>

новичок в C# код, любезно помочь мне, чтобы получить XML-документ, как и ожидалось. Ваша помощь очень ценится.

Спасибо, Мадхен

+0

Не могли бы вы конкретно указать, что не так с вашим выходом, т. Е. Как оно не соответствует тому, что вы ищете? Пожалуйста, не заставляйте нас расчесывать ваш XML, чтобы попытаться выяснить, что с ним не так. –

+0

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

+0

Используйте запрос XPath, например 'XmlNode titleNode = doc.SelectSingleNode (" // Envelope/Body/readContract ");' – user2867342

ответ

0

Похоже пространства имен вызывает проблему. Это работает для меня:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(File.ReadAllText("XMLFile1.xml")); 
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
ns.AddNamespace("ns1", "http://schemas.xmlsoap.org/soap/envelope/"); 
ns.AddNamespace("ns2", "http://implementation.company.schema.reference"); 
var rootNode = doc.SelectSingleNode("//ns1:Envelope", ns); 
var readContractNode = rootNode.FirstChild.FirstChild; 
var newNode = doc.CreateNode(XmlNodeType.Element, "productGroups", "http://implementation.company.schema.reference"); 
newNode.InnerText = "0093"; 
readContractNode.InsertAfter(newNode, readContractNode.SelectSingleNode("//ns2:productGroups", ns)); 

Или, если вы не фантазии пространств имен, как я меня, вы можете попробовать немного больше «грубой forcy» подход:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(File.ReadAllText("XMLFile1.xml")); 
var newNode = doc.CreateNode(XmlNodeType.Element, "productGroups", "http://implementation.company.schema.reference"); 
newNode.InnerText = "0093"; 
doc.FirstChild.FirstChild.FirstChild.InsertAfter(newNode, doc.FirstChild.FirstChild.FirstChild.FirstChild.NextSibling); 

Это может быть оптимизирован, но я подумайте, что это помогает сделать так, что основной причиной являются разные пространства имен в документе.

0

Когда вы сделаете это:

XmlElement parentEle = doc.DocumentElement; 
parentEle.AppendChild(xmlDocFrag); 

Вы Добавляя узел в корне документа. Вероятно, вам захотелось выбрать фактический узел readContract, к которому должен быть добавлен элемент. В качестве примера:

XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "productGroup", ""); 
newNode.InnerText = "something"; 

XmlNode readContractNode = doc["Envelope"]["Body"]["readContract"]; 
XmlElement groups = readContractNode["productGroups"]; 
readContractNode.InsertAfter(newNode, groups); 

Конечно, вы, вероятно, хотите, чтобы обрабатывать случай, когда имеется уже несколько дочерних productGroup элементов, но идея та же.

0

Возможно, вы захотите использовать XmlNode.InsertAfter Method.

public virtual XmlNode InsertAfter(
    XmlNode newChild, 
    XmlNode refChild 
) 

Где

newChild = The XmlNode to insert

и

refChild = The XmlNode that is the reference node. The newNode is placed after the refNode

Пожалуйста, проверьте this ссылку на информацию.

И проверить this ссылку с ответом на SO.

P.S.
Всегда проверяйте другие ответы перед публикацией нового вопроса.