我有这个XML:
node1
内容是可选的,但前面,中间或结尾可以有文本,node2
和public class RootNode
{
public String[] Text;
public Node1Type Node1;
public Node2Type Node2;
}
不需要出现。
我想将此XML序列化为以下C#类:
Node1
Node2
和Text
可以是更复杂的元素。 [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}}
如何捕获整个文本?
答案 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 answer到Correct 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>