Я десериализую большой XML-документ в объект С#.
Я столкнулся с проблемой, когда в одной строке есть несколько элементов 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>
Сгенерированный класс С# выглядит следующим образом:
[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-документ, поскольку он поступает от третьего лица.
благодаря
После десериализации стороннего XML в объект, который непосредственно соответствует схеме XML (как вы уже делали в приведенном выше примере), вы должны использовать XmlNode.InnerText() на узле <ce:para
чтобы извлечь то, что вы "искать без необходимости писать код разбора.
В этот момент вы можете сделать перевод с объекта, который вы десериализировали, из необработанного стороннего XML в объект, который выравнивает элемент <ce:para
в простой строке.
По просьбе Криса я отправляю свое решение. Вероятно, он мог бы использовать переработку, поскольку я не очень разбираюсь в запросах 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();