【问题标题】:cXml how to add tag using predefined classcXml如何使用预定义的类添加标签
【发布时间】:2018-02-18 07:56:05
【问题描述】:

我在将标签元素添加到 cXml 文档时遇到问题。我正在使用来自 cxml.org 的预定义类进行序列化。我想将名为 SharedSecret 的标签添加到现有文档中。它应该看起来像:

<Header>
<From><Credential domain="AribaNetworkUserId">
<Identity>sender@sendercompany.com</Identity>
</Credential>
</From>
<To>
<!-- Recipient -->
<Credential domain="AribaNetworkUserId">
<Identity>recipient@recipientcompany.com</Identity>
</Credential>
</To>
<Sender>
<!-- Sender -->
<Credential domain="AribaNetworkUserId">
<Identity>sender@sendercompany.com</Identity>
<SharedSecret>abracadabra</SharedSecret>
</Credential>
<UserAgent>Sender Application 1.0</UserAgent>
</Sender>
</Header>

我有课:

    public partial class Header
    {

        /// <remarks/>
        public From From;

        /// <remarks/>
        public To To;

        /// <remarks/>
        public Sender Sender;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("Node", IsNullable = false)]
        public Node[] Path;

        /// <remarks/>
        public OriginalDocument OriginalDocument;
    }

 public partial class Node
        {

            /// <remarks/>
            [System.Xml.Serialization.XmlElementAttribute("Credential")]
            public Credential[] Credential;

            /// <remarks/>
            [System.Xml.Serialization.XmlAttributeAttribute()]
            public NodeType type;

            /// <remarks/>
            [System.Xml.Serialization.XmlAttributeAttribute()]
            public NodeItemDetailsRequired itemDetailsRequired;

            /// <remarks/>
            [System.Xml.Serialization.XmlIgnoreAttribute()]
            public bool itemDetailsRequiredSpecified;
        }
 public Identity Identity;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("CredentialMac", typeof(CredentialMac))]
        [System.Xml.Serialization.XmlElementAttribute("DigitalSignature", typeof(DigitalSignature))]
        [System.Xml.Serialization.XmlElementAttribute("SharedSecret", typeof(SharedSecret))]
        public object Item;
...

public partial class SharedSecret
        {

            /// <remarks/>
            [System.Xml.Serialization.XmlTextAttribute()]
            [System.Xml.Serialization.XmlAnyElementAttribute()]
            public System.Xml.XmlNode[] Any;
        }

而且我不知道如何将此标签添加到文档中。 我花了很多时间尝试添加一些 Xmlnodes 元素和类似的东西。 我无法掌握的最困难的事情是 SharedSecret 类,其中我有一个字段,我必须添加一些插入另一个 XmlNode 的字符串。

所有 cXml 类都可用http://212.59.240.129/upload/cxml.txt

请帮帮我。

【问题讨论】:

  • 首先,您发布的课程无效。例如,To 和 From 对象不存在。那么你从哪里得到的课程?您不需要使用序列化来执行此任务。还有其他一些网络方法可以将两个 xml 文档添加在一起,可能更简单。
  • 我只粘贴了许多可用的类。 212.59.240.129/upload/cxml.txt
  • 共享密钥是一个类似于 Domain 的属性,所以它看起来像这样: 如果这确实有效,则使用示例数据创建类并进行序列化。然后查看序列化结果。
  • @jdweng 这不是属性...OP说得对。

标签: c# xml serialization xsd cxml


【解决方案1】:

这是我的测试代码:

        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            XmlNode[] identity = new XmlNode[] { doc.CreateTextNode("sender@sendercompany.com")};
            XmlNode[] sharedSecret = new XmlNode[] { doc.CreateTextNode("abracadabra") };

            Header header = new Header()
            {
                Sender = new Sender()
                {
                    Credential = new Credential[] {
                        new Credential() { 
                            domain = "AribaNetworkUserId",
                           Identity = new Identity() { Any =  identity },
                           Item = new SharedSecret() { Any = sharedSecret }
                        }
                    }
                }
            };

            XmlSerializer serializer = new XmlSerializer(typeof(Header));

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, header);
            writer.Flush();
            writer.Close();

        }

这里是 Xml

<?xml version="1.0" encoding="utf-8"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Sender>
    <Credential domain="AribaNetworkUserId">
      <Identity>sender@sendercompany.com</Identity>
      <SharedSecret>abracadabra</SharedSecret>
    </Credential>
  </Sender>
</Header>

【讨论】:

  • 这是不对的。 OP 已正确表明 SharedSecret 是具有内部文本的元素,而不是属性。你想要 doc.CreateNode(Xml.XmlNodeType.Text, "", "")sharedSecret[0].InnerText = "abracadabra" 代替。
  • 它在标识类中定义为对象标识,并使用 XmlElementAttribute 进行标记。您是否查看了所有课程的 URL?
  • 我对 CXML 非常熟悉。查看 XmlElementAttribute,又名 XmlElement 的含义。
  • 我修复了将 SharedSecret 作为元素的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2019-11-25
  • 2019-02-26
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多