将 xmlstring 转换为 XmlNode

本文关键字:XmlNode 转换 xmlstring | 更新日期: 2023-09-27 18:30:46

我有一个这样的 xml 字符串

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

我还创建了一个 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);

我需要这样的输出。

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

我怎样才能做到这一点,如果我们使用innerhtml,它将插入。但是我想插入xml字符串作为xmlnode本身

将 xmlstring 转换为 XmlNode

实现你所追求的目标的一个非常简单的方法是使用经常被忽视的 XmlDocumentFragment 类:

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

使用 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)));

你可以改用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

如果要将新的statusList内容写入文件:

statusList.Save(@"C:'yourFile.xml", SaveOptions.None);

你可以尝试使用XMLWRITER

using (XmlWriter writer = XmlWriter.Create("new.xml"))
{
        writer.WriteStartDocument();
        writer.WriteStartElement("StatusList");
        writer.WriteElementString("Status", "Success");   // <-- These are new
        writer.WriteEndDocument();
}
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);
        node.InnerXml=@"<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
}

根据我的经验,使用唯一 id 总是更好,我建议您先查看这种情况,然后返回此页面,如果您还没有解决方案,请研究/定位我的代码以进行尝试。我刚刚为我自己的项目完成了它,我已经修改了 abit 以使您的项目看起来更集成。祝你好运。抱歉回复晚了;-)

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