序列化XML节点之间的文本

时间:2018-08-16 20:19:43

标签: c# xml xml-serialization xmlserializer

我有这个XML:

node1

内容是可选的,但前面,中间或结尾可以有文本,node2public class RootNode { public String[] Text; public Node1Type Node1; public Node2Type Node2; } 不需要出现。

我想将此XML序列化为以下C#类:

Node1

Node2Text可以是更复杂的元素。 [XmlRoot( ElementName = "rootnode" )] public class RootNode { [XmlText] public String Text; [XmlElement( ElementName = "node1" )] public Node1Type Node1; [XmlElement( ElementName = "node2" )] public Node2Type Node2; } 成员应包含混合的文本部分。

我尝试使用此带注释的类:

public static T ParseXml<T>( String value ) where T : class {
    var xmlSerializer = new XmlSerializer( typeof( T ) );
    using( var textReader = new StringReader( value ) )
        return (T)xmlSerializer.Deserialize( textReader );
}

但是它只捕获开头的文本。

我使用此序列化:

{{1}}

如何捕获整个文本?

2 个答案:

答案 0 :(得分:0)

看看下面的例子:

var document =
    XDocument.Parse(
        "<rootnode>Some text <node1> A Name </node1> some more text <node2> A value </node2></rootnode> ");
var elements = document.Root.Elements();
var nodes = document.Root.Nodes();

元素是根目录内的node1和node2元素
这样,节点将是所有XNode,包括您的文本
看看document.Root.Value就是里面的所有文本,包括元素内部的文本。

您可以做的是遍历节点,并可能随行填充对象

我希望这会给您一些指导

祝你好运
盖维·施耐德(Gawie Schneider)

答案 1 :(得分:0)

根据documentation for XmlTextAttribute

  

您可以将XmlTextAttribute应用于返回字符串数组的字段或属性。

事实上,这样做会捕获<rootnode>的完整字符串内容:

[XmlRoot( ElementName = "rootnode" )]
public class RootNode
{
    [XmlText]
    public string [] Text;

    [XmlElement( ElementName = "node1" )]
    public Node1Type Node1;

    [XmlElement( ElementName = "node2" )]
    public Node2Type Node2;
}

工作小提琴#1 here显示XML被反序列化并重新序列化为:

<rootnode>
    Some text  some more text <node1>A Name</node1><node2>A value</node2></rootnode>

但是,您可能会注意到,文本节点和<nodeX>节点的交织没有保留。如有必要,您将需要使用this answerCorrect XML serialization and deserialization of "mixed" types in .NET Stefan 建议的多态对象数组:

[XmlRoot( ElementName = "rootnode" )]
public class RootNode
{
    [XmlText(typeof(string))]
    [XmlElement( ElementName = "node1", Type = typeof(Node1Type) )]
    [XmlElement( ElementName = "node2", Type = typeof(Node2Type) )]
    public object [] nodes;
}

您必须用XML serialization attributes标记该数组,以指示其中可能发生的所有可能的类型。

工作小提琴#2 here显示XML被反序列化并重新序列化为:

<rootnode>
    Some text <node1>A Name</node1> some more text <node2>A value</node2></rootnode>
相关问题