0

エラーが発生した xml ドキュメント内の特定のノードの行番号にアクセスしようとしています (属性の名前が間違っているなど)。エラーの行番号を決定するクラスのこれまでのコードは次のとおりです。

public class LineNumberFind
{
    private XmlNamespaceManager nsmgr;
    private XmlParserContext context;
    public XmlTextReader reader;

    public LineNumberFind(XmlDocument doc)
    {
        StringWriter sw = new StringWriter();
        XmlTextWriter tx = new XmlTextWriter(sw);
        doc.WriteTo(tx);
        string str = sw.ToString();
        //nsmgr = new XmlNamespaceManager(new NameTable());
        //context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
        reader = new XmlTextReader(str);
    }

    public int NamingErrorLine(XmlNode node)
    {
        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                reader.MoveToAttribute(0);
                if (reader.Value.ToString() == node.Attributes["name"].Value.ToString())
                    return reader.LineNumber;
            }
        }
        return 0;
    }
}

NamingErrorLine メソッドを使用しようとしているコード スニペット:

foreach (XmlNode item in doc.SelectNodes("configuration/events/Event"))
        {
            EventEnforce eventNode = new EventEnforce(syntaxError, item);
            if (item.Attributes["name"] != null && item.Attributes["cond"] != null)
            {
                // colorDict returns an int between 0 and 1 with 0 meaning
                // that it is an Action, 1 is a condition, and 2 is Event
                try
                {
                    eventName.Add(item.Attributes["name"].Value);
                    colorDict.Add(item.Attributes["name"].Value, 2);
                    eventDictionary.Add(item.Attributes["cond"].Value, item.Attributes["name"].Value);
                    eventNameToCondDict.Add(item.Attributes["name"].Value, item.Attributes["cond"].Value);
                }
                catch
                {
                    nameingErrors.Add("\tDuplicate entry found. Error at element: <event name=\"" + item.Attributes["name"].Value + "\".../>");
                    MessageBox.Show(lnf.NamingErrorLine(item).ToString());
                    containsSyntaxError = true;
                }
            }

        }

現在、使用している文字列 (string str = sw.ToString()) が長すぎて XmlTextReader(string str) で使用できないことがわかります。これについてもっと良い方法はありますか?しばらく探しましたが、他に何も見つかりませんでした。

4

1 に答える 1

0

XmlTextReader(string) コンストラクターは、xml テキストではなく URI を想定しています (ドキュメントを参照してください)。

代わりに次のことを考慮してください。

var reader = new XmlTextReader(new StringReader(sw.ToString()));
于 2013-08-01T23:27:19.213 に答える