在XML中添加根元素

3

我有一个XML字符串,它具有以下结构:

<Element>
   <Property1>Something</Propert1>
   <Property2>SomethingElse</Property2>
</Element>
<Element>
   <Property1>Something2</Propert1>
   <Property2>SomethingElse2</Property2>
</Element>

我希望将它序列化为一个 List<Element>。 我使用以下代码:

XmlSerializer xd = new XmlSerializer(typeof(T));

XDocument xdoc = XDocument.Parse(xmlStringToDesirialize);
T deserializedObject = xd.Deserialize(xdoc.CreateReader()) as T;

其中TList<Element>。我得到了一个异常,说有多个根元素。我理解这是为什么,但是我不确定该怎么做。

我想添加一个伪根元素,比如<Elements>可能是一个好的解决方案,但我不知道如何将其添加到我已经拥有的XML文档中。 或者也许有其他替代方案。

编辑:为了完整起见,我正在添加所需的反序列化完整解决方案的代码,以防有人需要。

我创建了一个类:

[XmlRoot("myRoot", Namespace = "")]
public class MyRoot
{
   [XmlElement("Element", Namespace = "{The xmlns of the actual class}")]
   public List<Element> Elements {get; set;}

   public MyRoot()
   {
      Elements = new List<Element>();
   }
}

接着我按照@Richard的建议添加标签后,对这个类进行反序列化。 希望这能帮助到某些人。

3个回答

4
我有一个XML字符串。
不是的,您有的是可以称为“XML片段”的东西。因为没有单个根元素,所以它不是XML文档。(不存在“无效的XML”这样的说法:它要么有效,要么就不是XML)。
XML解析器需要一个XML文档。但是XmlSeriailsie不仅包含了XML解析器(当然),还希望从XML文档的内容中生成对象图,以匹配类型可用性和对XML的限制。
使用普通XML解析器的最简单方法是自己添加一个根元素。例如:
var xdoc = XDocument.Parse("<myRoot>" + theString + "</myRoot>");

然而,对于XML反序列化,您需要修改可用类型以包含一个容器,该容器与myRoot元素序列化,然后包含相关信息。

但是根据我看到的示例XML,没有迹象表明它看起来像一个对象图。为什么不使用解析器的API使用解析后的XML提取内容呢?


+1 为一个简单而优雅的解决方案。一路上都要保持简洁直接。谢谢! - Elad Lachmi

1

XML必须有一个根元素。所以,就像你之前说的那样,将<elements>作为根节点是解决方案。 XML将看起来像:

<Elements>    
    <Element>
       <Property1>Something</Propert1>
       <Property2>SomethingElse</Property2>
    </Element>
    <Element>
       <Property1>Something2</Propert1>
       <Property2>SomethingElse2</Property2>
    </Element>
</Elements>

W3Schools不是W3C。除了名称以“W3”开头外,它与W3C没有任何关系。并且要小心推荐W3Schools:他们的内容质量参差不齐。 - Richard

0
为什么不创建一个元素然后将您的元素附加到它上面?
XElement root = new XElement("root");
然后将您的元素附加到它上面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接