【问题标题】:Add Attribute to XMLROOT ElementName将属性添加到 XMLROOT ElementName
【发布时间】:2013-05-24 10:35:20
【问题描述】:

我有一个具有类属性的类:

[XmlRoot(ElementName = "RootXML")]
public class Apply
{
    /My Properties
}

现在从上面的类创建一个xml,我使用下面的函数:

public virtual string RenderXml()
{

    XmlTextWriter writer = null;
    try
    {
        MemoryStream ms = new MemoryStream();
        writer = new XmlTextWriter(ms, Encoding.UTF8);
        writer.Formatting = Formatting.Indented;
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        _xmlSerializer.Serialize(writer, this, ns);
        ms.Position = 0;
        using (StreamReader sr = new StreamReader(ms))
        {
            return sr.ReadToEnd();
        }
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

我的问题是如何将属性添加到“RootXML”并从配置文件和函数中读取属性值,例如

<RootXML attr1="read from config" attr2="read from function" >
    <Property1>value</Property1>
</RootXML>

【问题讨论】:

  • 你试过了吗:writer.WriteAttributeString("AttrNAme", "AttrValue");
  • 试过这个: writer.WriteAttributeString("RootXML", "attr1=" + System.Configuration.ConfigurationManager.AppSettings["id"]);但得到异常:抛出类型为 'System.InvalidOperationException 的异常
  • 堆栈跟踪是什么。
  • 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o , XmlSerializerNamespaces namespaces) 在 PDB.UK.UI.ApplyInfoContainer.RenderXml() 在 C:\Proj\Container.cs:line 227 at btnSubmit_Click(Object sender, EventArgs e) in C:\Proj\Project\Create.aspx.cs :185行

标签: c# xml elementname xmlroot


【解决方案1】:

您可以将[XmlAttribute] 属性添加到您的类属性中,该属性将被序列化为属性

[XmlRoot(ElementName = "RootXML")]
public class Apply
{
    private string _testAttr="dfdsf";



    [XmlAttribute]
    public String TestAttr
    {
        get { return _testAttr; }

        set { _testAttr = value; }
    }
}

该类的序列化结果

<RootXML TestAttr="dfdsf" />

为最后一条评论添加。 如果我理解正确,您在会话中只需要一个键。如果是真的,你可以使用类似的东西:

string GetKey(){

      if (String.IsNullOrEmpty(HttpContext.Current.Session["mySessionKey"].ToString()))
                HttpContext.Current.Session["mySessionKey"] = GenereteKey();
      return HttpContext.Current.Session["mySessionKey"].ToString();

}

【讨论】:

  • 它有效,但有一个问题。我这样调用了一个静态函数:private string _testAttr= GetKey();这将生成一个 guid 并将其放入 HttpContext.Current.Session ...我的问题是,这会为每个会话创建一个密钥吗?
  • @Sam,请参阅答案修复。这就是你需要的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多