Вложенные элементы и скрипты - PullRequest
0 голосов
/ 28 октября 2010

В настоящее время я пытаюсь создать и применить (в c #) синтаксический анализ XML-файла и изменить текст в зависимости от элементов и тегов внутри текста.

Пример:

 <conversation>
   <message from=Bob>
       <typewriter dif=0.5>
           <Text>               
               Bob: Hello <replace>Country<with>World</with></replace>`
           </Text>
      </typewriter>
   <message>
</conversation>

Вывод будет выглядеть следующим образом:

Он начинает писать "Bob: Hello Country", как старая пишущая машинка (буква за буквой), и когда пишется "Country", он удаляет это слово и начинаетНапиши Мир вместо.Итак, окончательный вывод будет: «Bob: Hello World»

Итак, вот мои вопросы: после синтаксического анализа XML-файла, каков хороший подход для хранения данных, чтобы программа знала, какие элементы содержат какие элементы?(например, Сообщение содержит пишущую машинку)

Чтобы программа распознала теги скрипта внутри элемента Text.Как я могу это сделать?и как заставить это работать как пример?

Я не буду просить законченный код здесь, только некоторые указатели в правильном направлении.Я все еще новичок в программировании, поэтому я хочу учиться.

Я не знал, что искать, так что если что-то подобное уже опубликовано, то извините.

1 Ответ

1 голос
/ 28 октября 2010

По большей части вы можете представлять свои данные так, как они представлены в XML:

public class Conversation 
{
    public IEnumerable<Message> Messages {get;set;}
}

public class Message
{
    public string From {get;set;}
    public IEnumerable<TypeWriter> TypeWriters {get;set;}
}

... и т. Д. Но если ваш XML будет разрешать разные типы узлов в любом порядке (например, пишущие машинки и компьютеры взаимозаменяемо), вам нужно настроить это.

Когда дело доходит до вашего текстового узла, буквальный текст и другие узлы должны рассматриваться как своего рода действие.

public class TypewriterText
{
    public IEnumerable<ITypewriterTextAction> TextActions {get;set;}
}

public enum TypeWriterTextActionType
{
    Plain,
    Replace
}

public interface ITypewriterTextAction
{
    TypeWriterTextActionType ActionType {get;}
}

public class PlainTypeWriterTextAction : ITypewriterTextAction
{
    public TypeWriterTextActionType ActionType 
    {
        get {return TypeWriterTextActionType.Plain;
    }
    public string TextToWrite {get;set;}
}

public class ReplaceTypeWriterTextAction : ITypewriterTextAction
{
    public TypeWriterTextActionType ActionType 
    {
        get {return TypeWriterTextActionType.Replace;
    }
    public string OriginalText {get;set;}
    public string ReplacementText {get;set;}
}

Используйте технологию, подобную LINQ to XML, для разбора XML на эти объекты, затем напишите методы, которые могут принимать эти объекты и выполнять соответствующие действия.Например, вам понадобится один класс, который умеет делать анимацию Plain, а другой - анимацию Replace, и вы можете использовать оператор switch для свойства Type каждого действия, чтобы определить, какой класс анимации использовать.

...