2012-04-10 27 views
6

tengo una cadena XML como estoConvertir xmlString en XmlNode

string stxml="<Status>Success</Status>"; 

También creaated un documento XML

XmlDocument doc = new XmlDocument(); 
    XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
    doc.AppendChild(docNode); 
    XmlNode rootNode = doc.CreateElement("StatusList"); 
    doc.AppendChild(rootNode); 

necesito una salida como esta.

<StatusList> 
    <Status>Success</Status> 
    </StatusList> 

¿Cómo puedo lograr que this.If usando innerHTML, se insert.But quiero insertar cadena XML como xmlnode sí

+0

Ver esta pregunta http://stackoverflow.com/questions/4130341/better-way-to-convert-a-string-to-xmlnode-in-c-sharp –

Respuesta

16

Una forma muy sencilla de lograr lo que está después es utilizar la frecuencia se pasa por alto XmlDocumentFragment clase:

XmlDocument doc = new XmlDocument(); 
    XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
    doc.AppendChild(docNode); 
    XmlNode rootNode = doc.CreateElement("StatusList"); 
    doc.AppendChild(rootNode); 

    //Create a document fragment and load the xml into it 
    XmlDocumentFragment fragment = doc.CreateDocumentFragment(); 
    fragment.InnerXml = stxml; 
    rootNode.AppendChild(fragment); 
+0

intentaré esto ... – user922834

1

Usando Linq to XML:

string stxml = "<Status>Success</Status>"; 
XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("StatusList", XElement.Parse(stxml))); 
+1

Recibí un error como este ... No puedo convertir implícitamente el tipo 'System.Xml.Linq.XDocument' en 'System.Xml.XmlDocument' \t Error – user922834

+0

no necesita XmlDocument, ya tiene el XDocument y simplemente llame a Guardar si desea guardar el xml – ionden

1

en su lugar podría utilizar la clase XElement:

string stxml = "<Status>Success</Status>"; 
var status = XElement.Parse(stxml); 
var statusList = new XElement("StatusList", status); 

var output = statusList.ToString(); // looks as you'd like 

Si desea escribir la nueva statusList contenido en un archivo:

statusList.Save(@"C:\yourFile.xml", SaveOptions.None); 
+0

La salida también debe ser un xml – user922834

+0

yes salida shoule ser un xml.Así que estoy preguntando cómo insertarlo como nodo ... – user922834

0

que ca intentarlo usando xmlwriter

using (XmlWriter writer = XmlWriter.Create("new.xml")) 
{ 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("StatusList"); 
     writer.WriteElementString("Status", "Success"); // <-- These are new 
     writer.WriteEndDocument(); 
} 
0
using System; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 
using System.Reflection; 
using System.ComponentModel; 


public class MyClass 
{ 
    public static void RunSnippet() 
    { 
     XmlNode node = default(XmlNode); 
     if(node == null) 
      Console.WriteLine(bool.TrueString); 
     if(node != null) 
      Console.WriteLine(bool.FalseString); 

     XmlDocument doc = new XmlDocument(); 

     node = doc.CreateNode (XmlNodeType.Element,"Query", string.Empty); 

     [email protected]"<Where><Eq><FieldRef Name=""{0}"" /><Value Type=""{1}"">{2}</Value></Eq></Where>"; 

     string xmlData = ToXml<XmlNode>(node); 

     Console.WriteLine(xmlData); 

     XmlNode node1 = ConvertFromString(typeof(XmlNode), @"<Query><Where><Eq><FieldRef Name=""{0}"" /><Value Type=""{1}"">{2}</Value></Eq></Where></Query>") as XmlNode; 
     if(node1 == null) 
      Console.WriteLine(bool.FalseString); 
     if(node1 != null) 
      Console.WriteLine(bool.TrueString); 

     string xmlData1 = ToXml<XmlNode>(node1); 
     Console.WriteLine(xmlData1); 
    } 
    public static string ToXml<T>(T t) 
    { 
     string Ret = string.Empty; 
     XmlSerializer s = new XmlSerializer(typeof(T)); 
     using (StringWriter Output = new StringWriter(new System.Text.StringBuilder())) 
     { 
      s.Serialize(Output, t); 
      Ret = Output.ToString(); 
     } 
     return Ret; 
    } 
     public static object ConvertFromString(Type t, string sourceValue) 
     { 
      object convertedVal = null; 

      Type parameterType = t; 
      if (parameterType == null) parameterType = typeof(string); 
      try 
      { 

       // Type t = Type.GetType(sourceType, true); 
       TypeConverter converter = TypeDescriptor.GetConverter(parameterType); 
       if (converter != null && converter.CanConvertFrom(typeof(string))) 
       { 
        convertedVal = converter.ConvertFromString(sourceValue); 
       } 
       else 
       { 
        convertedVal = FromXml(sourceValue, parameterType); 
       } 
      } 
      catch { } 
      return convertedVal; 
     } 
       public static object FromXml(string Xml, Type t) 
     { 
      object obj; 
      XmlSerializer ser = new XmlSerializer(t); 
      using (StringReader stringReader = new StringReader(Xml)) 
      { 
       using (System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(stringReader)) 
       { 
        obj = ser.Deserialize(xmlReader); 
       } 
      } 
      return obj; 
     } 

    #region Helper methods 

    public static void Main() 
    { 
     try 
     { 
      RunSnippet(); 
     } 
     catch (Exception e) 
     { 
      string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString()); 
      Console.WriteLine(error); 
     } 
     finally 
     { 
      Console.Write("Press any key to continue..."); 
      Console.ReadKey(); 
     } 
    } 

    private static void WL(object text, params object[] args) 
    { 
     Console.WriteLine(text.ToString(), args); 
    } 

    private static void RL() 
    { 
     Console.ReadLine(); 
    } 

    private static void Break() 
    { 
     System.Diagnostics.Debugger.Break(); 
    } 

    #endregion 
} 
+0

Podría ser útil agregar un poco de información explicativa a su respuesta, en lugar de solo un bloque de código en su propio. –

0

Desde mi experiencia, siempre es mejor trabajar con identificadores únicos, sugiero que mire primero en esa situación y el Regrese a esta página e investigue/coloque mi código para probarlo si aún no tiene una solución para ello. Acabo de terminarlo de mi lado para mi propio proyecto, lo he modificado para que parezca más integrado para su proyecto. Buena suerte. Lo siento por la respuesta tardía ;-)

   XmlDocument xDoc = new XmlDocument(); 
       string Bingo = "Identification code"; 
       xDoc.Load(pathFile); 
       XmlNodeList idList = xDoc.GetElementsByTagName("id"); 
       XmlNodeList statusList = xDoc.GetElementsByTagName("Status");   

       for (int i = 0; i < idList.Count; i++) 
       { 
        StatusNode = "<Status>fail</Status>"; 
        XmlDocumentFragment fragment = xDoc.CreateDocumentFragment(); 
        fragment.InnerXml = StatusNode; 
        statusList[i].InnerXml = ""; 
        statusList[i].AppendChild(fragment); 
        if (statusList[i].InnerText == Bingo) 
        { 
        StatusNode = "<Status>Succes!</Status>"; 
        fragment.InnerXml = Status; 
        statusList[i].InnerXml = ""; 
        statusList[i].AppendChild(fragment); 


        } 


       } 
       xDoc.Save(pathFile);