0

我有以下代码引发错误...

错误...

对于非数组类型,您可以使用以下属性:XmlAttribute、XmlText、XmlElement 或 XmlAnyElement。

代码(Go 方法的最后一行是抛出异常)...

    public void Go(Type typeToSerialize, object itemToSerialize)
    {
        Dictionary<string, bool> processedList = new Dictionary<string, bool>();
        XmlAttributeOverrides overrides = new XmlAttributeOverrides();

        AttachXmlTransforms(overrides, itemToSerialize.GetType(), processedList);

        s = new XmlSerializer(typeToSerialize, overrides);
    }

    private static void AttachXmlTransforms(XmlAttributeOverrides overrides, Type root,
        Dictionary<string, bool> processedList)
    {
        foreach (PropertyInfo pi in root.GetProperties())
        {
            string keyName = pi.DeclaringType + "-" + pi.Name;

            if ((pi.PropertyType == typeof(DateTime) || pi.PropertyType == typeof(DateTime?))
                && !processedList.ContainsKey(keyName))
            {
                XmlAttributes attributes = new XmlAttributes();

                attributes.XmlElements.Add(new XmlElementAttribute(pi.Name));
                //attributes.XmlAnyAttribute = new XmlAnyAttributeAttribute();
                attributes.XmlAttribute = new XmlAttributeAttribute("dval");

                //attributes.XmlIgnore = true;

                processedList.Add(keyName, true);


                overrides.Add(pi.DeclaringType, pi.Name, attributes);
            }

            if (pi.MemberType == MemberTypes.Property && !pi.PropertyType.IsPrimitive
                && pi.PropertyType.IsPublic && pi.PropertyType.IsClass
                && pi.PropertyType != typeof(DateTime))
            {
                AttachXmlTransforms(overrides, pi.PropertyType, processedList);
            }
        }
    }

我正在尝试将属性(dval)添加到仅 DateTime 元素(这是外部要求)...

由此...

   <CreatedDate>01/01/2012</CreatedDate>

对此...

   <CreatedDate dval="01/01/2012">01/01/2012</CreatedDate>

有没有办法将属性添加到普通的非数组类型元素?

4

2 回答 2

1

我想你的线路有问题

attributes.XmlElements.Add(new XmlElementAttribute(pi.Name))

首先,从命名约定来看,我猜这XmlElements不是 Xml 元素,而是元素的集合

此外,根据您的错误消息判断,该XmlElements Add方法不会将您XmlElementAttribute作为参数,而是需要XmlAttribute, XmlText, XmlElement, or XmlAnyElement.

于 2012-11-28T18:19:13.310 回答
0

我最终以不同的方式接近了这个......

1) 将对象转换为 XML

2)运行以下...

        using (MemoryStream memStm = new MemoryStream())
        {
            // Serialize the object using the standard DC serializer.
            s.WriteObject(memStm, graph);

            // Fix the memstream location.
            memStm.Seek(0, SeekOrigin.Begin);

            // Load the serialized document.
            XDocument document = XDocument.Load(memStm);

            foreach (KeyValuePair<string, ItemToAmend> kvp in _processedDateTimes)
            {
                // Locate the datetime objects.
                IEnumerable<XElement> t = from el in document.Descendants(XName.Get(kvp.Value.ProperyName, kvp.Value.PropertyNamespace))
                                          select el;

                // Add the attribute to each element.
                foreach (XElement e in t)
                {
                    string convertedDate = string.Empty;

                    if (!string.IsNullOrEmpty(e.Value))
                    {
                        DateTime converted = DateTime.Parse(e.Value);

                        convertedDate = string.Format(new MyBtecDateTimeFormatter(), "{0}", converted);
                    }

                    e.Add(new XAttribute(XName.Get("dval"), convertedDate));
                }
            }

            // Write the document to the steam.
            document.Save(writer);
        }
于 2012-11-29T15:02:16.433 回答