我将大型xml文档反序列化为C#对象。
我遇到了同一行上有多个xml元素的问题,我在代码中正确地重构它们时遇到了麻烦。
一个片段示例如下:
<parent>
<ce:para view="all">
Text <ce:cross-ref refid="123">[1]</ce:cross-ref> More Text <ce:italic>Italicized text</ce:italic> and more text here
</ce:para>
<ce:para>...</ce:para>
</parent>
生成的C#类看起来像这样
[XmlRoot(ElementName = "para", Namespace = "namespace")]
public class Para
{
[XmlElement(ElementName = "cross-ref", Namespace = "namespace")]
public List<Crossref> Crossref { get; set; }
[XmlText]
public List<string> Text { get; set; }
[XmlElement(ElementName = "italic", Namespace = "namespace")]
public List<Italic> Italic { get; set; }
}
我希望能够遍历此对象并将该句子重新构造为普通字符串。
文字[1]更多文字斜体文字和更多文字
唯一的问题是,当反序列化发生时,顺序会丢失,因为每个位都插入到它的相应对象中。这意味着我无法知道如何将字符串重新构造回应该如何。
Text: {"Text", "More Text", "and more text here"}
Crossref: {"[1]"}
Italic: {"Italicized Text"}
我已经考虑过将整个元素作为一个字符串引入,然后从中清除标签,但我不确定如何正确地将其反序列化。或者,如果有更好的方法可以解决它。
免责声明:我无法更改XML文档,因为它来自第三方。
由于
答案 0 :(得分:1)
将第三方XML反序列化为直接与XML架构匹配的对象(正如您在上面的示例中已经完成的那样),您应该可以在{{XmlNode.InnerText()上使用{{3}} 1}}节点,无需编写任何解析代码即可提取您正在查找的内容。
此时,您可以将您反序列化的对象从原始第三方XML转换为将<ce:para
节点展平为简单字符串的对象。
答案 1 :(得分:1)
根据克里斯的要求,我正在发布我的解决方案。它可能会使用精炼,因为我对linq查询不是很有经验。
XDocument xdoc = xmlAdapter.GetAsXDoc(xmlstring);
IEnumerable<XElement> body = from b in xdoc.Descendants()
where b.Name.LocalName == "body"
select b;
IEnumerable<XElement> sections = from s in body.Descendants()
where s.Name.LocalName == "sections"
select s;
IEnumerable<XElement> paragraphs = from p in sections.Descendants()
where p.Name.LocalName == "para"
select p;
string bodytext = "";
if (paragraphs.Count() > 0)
{
StringBuilder text = new StringBuilder();
foreach (XElement p in paragraphs)
{
text.AppendFormat("{0} ", p.Value);
}
}
bodytext = text.ToString();