序列化 XML 个节点之间的文本
Serialize text between XML nodes
我有这个XML:
<rootnode>
Some text <node1>A Name</node1> some more text <node2>A value</node2>
</rootnode>
虽然内容是可选的,但前面、中间或结尾都可以有文字,node1
和node2
不需要出现。
我想将此 XML 序列化为以下 C# class:
public class RootNode
{
public String[] Text;
public Node1Type Node1;
public Node2Type Node2;
}
Node1
和 Node2
可以是更复杂的元素。 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>
我有这个XML:
<rootnode>
Some text <node1>A Name</node1> some more text <node2>A value</node2>
</rootnode>
虽然内容是可选的,但前面、中间或结尾都可以有文字,node1
和node2
不需要出现。
我想将此 XML 序列化为以下 C# class:
public class RootNode
{
public String[] Text;
public Node1Type Node1;
public Node2Type Node2;
}
Node1
和 Node2
可以是更复杂的元素。 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>