0

だから私は次のコードを持っています:

public static void Replace(filepath)
{
    try
    {
        XElement xD = XElement.Load(filePath);
        foreach (XElement xE in xD.Elements())
        {
            Console.WriteLine(xE.Attribute("attr").Value);
            if (tuv.Attribute("attr") != null)
            {
                Console.WriteLine(xE.Attribute("attr").Value);
                if (Regex.IsMatch(xE.Attribute("attr").EndsWith("AA"))
                {
                    Console.WriteLine("match");
                    tuv.Attribute("attr").Value.Replace("AA", "");
                }
                Console.WriteLine(xE.Attribute("attr").Value);
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Failure in Replace: {0}", e.ToString());
    }
}

そして、私が得ているエラーは次のとおりです。置換の失敗:System.NullReferenceException:オブジェクト参照がオブジェクトの参照に設定されていません。Application.Program.Replace(string filepath)の21行目(最初のConsole.WriteLine)

このプログラムの目的は、特定の条件を満たすXMLファイル内の属性名を編集することです...したがって、たとえば、次のようになります。

<element attr="brAA"></element>

これは次のように編集されます。

<element attr="br"></element>

私の知る限り、要素のコレクションxD.Elements()の内容を表す変数xEを作成しています...私はこれに1時間頭を悩ませてきました!なぜ私がこのエラーを受け取るのかについて誰かが何か洞察を持っていますか?

どうもありがとうございます!

これがXMLのスニペットです

<body>
    <par>
    <prop type="Doc">1</prop>
    <elem attr="aaaa">
        <child>REDACTED</child>
    </elem>
    <elem attr="aaAA">
        <child>REDACTED</child>
    </elem>
    <elem lang="abaa">
        <child>REDACTED</child>
    </elem>
    <elem attr="abAA">
        <child>REDACTED</child>
    </elem>
    <elem attr="acaa">
        <child>REDACTED</child>
    </elem>
    </par>
</body>
4

2 に答える 2

1

すべての要素を反復処理し、「attr」属性の値を表示しています。ただし、一部のノードには「attr」属性がないため、エラーが発生します。ブロックのConsole.WriteLine外側を削除すると、機能するはずです。if

public static void Replace(filepath)
{
    try
    {
        XElement xD = XElement.Load(filePath);
        foreach (XElement xE in xD.Descendants())
        {
            if (xE.Attribute("attr") != null)
            {
                Console.WriteLine(xE.Attribute("attr").Value);
                if (Regex.IsMatch(xE.Attribute("attr").Value))
                {
                    Console.WriteLine("match");
                    xE.Attribute("attr").Value.Replace("AA", "");
                }
                Console.WriteLine(xE.Attribute("attr").Value);
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Failure in Replace: {0}", e.ToString());
    }
}
于 2012-05-18T15:20:03.223 に答える
1

ある要素のみを操作する必要が<elem>あり、実際には属性の値を置き換える必要があります。あなたの.Replace()はそれをしていません。

以下のコードは要素を反復処理し<elem>、正しい置換があります。xE.Attribute("attr").Value = xE.Attribute("attr").Value.Replace("AA", "");

また、正規表現の一致を取り除くために.EndsWithを変更しました。最後に、欠落している属性に対するエラー処理はここにはありません。それもチェックする必要があります。

    foreach (XElement xE in xD.Descendants("elem"))
    {
        //Console.WriteLine(xE.Attribute("attr").Value);
        if (xE.Attribute("attr") != null)
        {
            Console.WriteLine(xE.Attribute("attr").Value);
            if (xE.Attribute("attr").Value.EndsWith("AA"))
            {
                Console.WriteLine("match");
                xE.Attribute("attr").Value = xE.Attribute("attr").Value.Replace("AA", "");
            }
            Console.WriteLine(xE.Attribute("attr").Value);
        }
    }

*編集-あなたはファイルを書き出す方法を尋ねました。これはそれを上書きします。

    using(var sw = new StreamWriter(filepath, false))
    {
        sw.Write(xD.ToString());
        sw.Close();
    }
于 2012-05-18T15:26:14.093 に答える