XML десериализация многих типов

1

Я десериализую большой 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-deserialization

2 ответа

1
Лучший ответ

После десериализации стороннего XML в объект, который непосредственно соответствует схеме XML (как вы уже делали в приведенном выше примере), вы должны использовать XmlNode.InnerText() на узле <ce:para чтобы извлечь то, что вы "искать без необходимости писать код разбора.

В этот момент вы можете сделать перевод с объекта, который вы десериализировали, из необработанного стороннего XML в объект, который выравнивает элемент <ce:para в простой строке.

  • 0
    Спасибо, Крис. Я закончил тем, что сделал немного другое, используя XDocument и Linq, чтобы получить мой текст, но я собираюсь пометить ваш ответ как правильный, так как я все еще следовал вашей логике, чтобы получить результат.
  • 0
    Если у вас есть время, добавьте свой ответ в качестве альтернативы. Я хотел бы увидеть, как вы в итоге реализовали это.
Показать ещё 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();
  • 1
    Спасибо, что поделился, Ник! p.Value ведет себя очень похоже на node.InnerText ()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню