0

編集: Jon Skeet によって提供されたコードを使用します。

次のエラーが表示されます。

Message: There is an error in XML document (2, 2).
Inner Exception: {"<Translator xmlns=''> was not expected."}

それが役立つ場合は、以下のコードを提供できます。

Translator.cs:

public class Translator
{
    public FullBotTranslation Translation;

    public Translator()
    {
        Translation = new FullBotTranslation();
    }

    public void LoadLanguage(string language)
    {
        if (!Useful.ExistFile(System.AppDomain.CurrentDomain.BaseDirectory + "\\LanguagePacks\\" + language + ".xml"))
            language = "Francais";

        Translation = XmlSerializerHelper.Deserialize<FullBotTranslation>(System.AppDomain.CurrentDomain.BaseDirectory + "\\LanguagePacks\\" + language + ".xml");
    }


    public string GetTranslation(PhraseID phraseId)
    {
        foreach (Phrase phrase in Translation.Phrases)
        {
            if (phrase.PhraseID == phraseId)
                return phrase.PhraseString;
        }

        return "Incomplete translation...";
    }

    #region Nested type: Translation

    [Serializable]
    public class FullBotTranslation
    {
        public List<Phrase> Phrases = new List<Phrase>();
    }

    #endregion
}

Phrase.cs:

public class Phrase
{
    public PhraseID PhraseID { set;  get; }
    public string PhraseString{ set; get; } 

    public Phrase()
    {

    }
}

PhraseID.cs

[Serializable]
public enum PhraseID
{
    none,
    Button_Start,
    Button_Stop,
}

私はこのように使用します:

設定:

private Translator _translator;
_translator = new Translator();

保存:

Helpers.XmlSerializerHelper.Serialize(
            System.AppDomain.CurrentDomain.BaseDirectory + "\\LanguagePacks\\" + langPackName.Text + ".xml",
            _translator);

読み込み中:

        _translator = new Translator(); //yes this is needed ;)

        _translator.LoadLanguage(preloadedLangCombo.SelectedItem.ToString());

上記のコードを使用して XML ファイルを保存すると、次のように出力されます。

英語.XML:

<?xml version="1.0"?>
<Translator xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Translation>
    <Phrases>
      <Phrase>
        <PhraseID>none</PhraseID>
        <PhraseString>Incomplete Translation</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Start</PhraseID>
        <PhraseString>Start</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Stop</PhraseID>
        <PhraseString>Stop</PhraseString>
      </Phrase>
    </Phrases>
  </Translation>
</Translator>
4

1 に答える 1

0

ここで何が問題なのかは明確ではありません。特に、エラー メッセージがサンプル XML と一致していないように見えるためです。ただし、例外処理は問題を隠している可能性があります-そのようなすべての例外をキャッチするのは本当に悪い考えであり、関連するストリームを閉じるために不必要な長さになります. 私はあなたのクラスをこれだけに要約します:

public static class XmlSerializerHelper
{
    public static void Serialize(String path, object @object)
    {
        using (var stream = File.Create(path))
        {
            var s = new XmlSerializer(@object.GetType());
            s.Serialize(stream, @object);
        }
    }

    public static T Deserialize<T>(String path)
    {
        using (var stream = File.OpenRead(path))
        {
            var s = new XmlSerializer(typeof(T));
            return (T) s.Deserialize(stream);
        }
    }
}

何か問題が発生した場合、例外は偽装されるのではなく、メソッドから伝播されます。また、関与するのではなく、ストリームとの間でシリアル化したことに注意してくださいStreamWriter。XML インフラストラクチャにすべてのエンコーディングを処理させる方が簡単です。

上記のコードは、簡単なテストで問題なく動作します。

于 2012-12-12T07:24:31.263 に答える