エラーが発生した 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) で使用できないことがわかります。これについてもっと良い方法はありますか?しばらく探しましたが、他に何も見つかりませんでした。