序列化 XML 个节点之间的文本

Serialize text between XML nodes

我有这个XML:

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

虽然内容是可选的,但前面、中间或结尾都可以有文字,node1node2不需要出现。

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

public class RootNode
{
    public String[] Text;
    public Node1Type Node1;
    public Node2Type Node2;
}

Node1Node2 可以是更复杂的元素。 Text 成员应包含混合文本部分。

我试过使用这个带注释的 class:

[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 );
}

如何捕获整个文本?

看看下面的例子:

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 里面的所有文字,包括元素里面的文字。

你可以做的是遍历你的节点,也许在你去的时候填充你的对象

我希望这能给你一些指导

祝你好运
高维·施耐德

根据 documentation for XmlTextAttribute:

You can apply the XmlTextAttribute to a field or property that returns an array of strings.

而且,实际上这样做会捕获 <rootnode>:

的完整字符串内容
[XmlRoot( ElementName = "rootnode" )]
public class RootNode
{
    [XmlText]
    public string [] Text;

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

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

工作 fiddle #1 here 表明 XML 被反序列化并重新序列化为:

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

但是,您可能会注意到,文本节点和 <nodeX> 节点的交错未保留。如果有必要,您将需要使用 this answer to Correct XML serialization and deserialization of "mixed" types in .NET by 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 标记数组,指示其中可能出现的所有可能类型。

工作 fiddle #2 here 表明 XML 被反序列化并重新序列化为:

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