我有一个基本上包含XML文件的字符串,带有标签和所有内容。
我特别感兴趣的一个标签是<address source>
。
问题是,XML文件并不总是相同的。有时可能只有一个标记<address source>
存在,有时可能有5个存在,有时甚至20个或更多。
所以,想象一下我的字符串是这样的:
string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>"`
因此,在此特定字符串中,标记<address source>
的两倍。
我需要的是:
我需要找到每个标记<address source>
的索引(或IndexOf),我需要单独存储这些索引,最好是单独存储(每个索引一个整数),或者在数组中。这是因为我需要访问每个单独的整数以填充Winforms表单中的某些字段。
这可能吗?
答案 0 :(得分:1)
您需要的是IDictionary&lt; [string],IList&lt; [int]&gt;&gt;。 在搜索开始标记时,可以按以下方式将它们存储在字典中: 如果标记存在,则将新找到的索引添加到添加的列表中,否则将新元素添加到字典中,其中包含新的列表,其中包含单个项目 - 索引的第一个出现。在您查看完所有字符串后 - 您的字典将包含您要查找的地图。
public static class XmlTagMapBuilder
{
public static IDictionary<string, IList<int>> GetOpenTagIndexMap(string inputXml)
{
// Argument validation goes here
IDictionary<string, IList<int>> result = new Dictionary<string, IList<int>>();
int currentIndex = -1;
string lastOpenTag = null;
while (true)
{
string nextOpenTagName;
int nextOpenTagIndex;
if (TryGetNextOpenTagIndex(inputXml, currentIndex, out nextOpenTagName, out nextOpenTagIndex))
{
lastOpenTag = nextOpenTagName;
currentIndex = nextOpenTagIndex;
IList<int> tagIndicies;
if (!result.TryGetValue(nextOpenTagName.ToUpperInvariant(), out tagIndicies))
{
tagIndicies = new List<int>();
result.Add(nextOpenTagName, tagIndicies);
}
tagIndicies.Add(nextOpenTagIndex);
}
else
{
break;
}
}
return result;
}
/// <summary>
/// Tries to get next open tag in the given <see cref="inputXml"/> string after the specified startIndex.
/// </summary>
/// <param name="inputXml">The string which contains the xml tags.</param>
/// <param name="startIndex">The index after which to look for the open tag.</param>
/// <param name="nextOpenTagName">If a tag was found, contains its name.</param>
/// <param name="nextOpenTagIndex">If a tag was found, contains the start index of it.</param>
/// <returns>true - if the tag was found. false - otherwise.</returns>
private static bool TryGetNextOpenTagIndex(string inputXml, int startIndex, out string nextOpenTagName, out int nextOpenTagIndex)
{
// Need to add implementaiton here
}
}
答案 1 :(得分:1)
使用Regex匹配所有字符串,然后遍历匹配并找到每个匹配的索引。
这种逻辑必须奏效。这是Tested
List<int> indexes = new List<int>();
string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>";
var regex = new Regex(@"<address source>");
foreach (Match match in regex.Matches(XMLToAnalyze))
{
indexes.Add(match.Index);
}
indexes
将包含匹配字符串的所有索引。
OutPut: 29,69