处理xml文件并提取要列出的数据



我正在学习使用C#。我有一个文件window_dump.xml。我需要将所需的数据提取到一个特定的列表中,如下所示:


text="界限=";[0,0][10802076]">
text="不是你吗"界限=";[4371900][6431983]">
text="注销"|界限=";[4571983][622058]">

text="quot|界限=";[0264][10802076]">


这是xml文件的全部内容:window_dump.xml

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy rotation="0">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2076]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,2076]">
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][1080,2076]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][1080,2076]">
<node index="0" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][1080,264]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][1080,264]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][1080,264]">
<node index="0" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.ImageView" package="com.facebook.katana" content-desc="Back" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,108][48,264]" />
<node index="1" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[48,108][1032,264]">
<node index="0" text="Confirm by email" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.TextView" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[48,108][452,264]" />
</node>
<node index="2" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1032,108][1080,264]" />
</node>
<node index="1" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.view.View" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,262][1080,264]" />
</node>
</node>
<node index="1" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,264][1080,2076]">
<node index="0" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,264][1080,2076]">
<node index="0" text="" resource-id="" class="android.widget.ScrollView" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,264][1080,2076]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,264][1080,2076]">
<node index="0" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,264][1080,2076]">
<node index="0" text="We couldn't reach you at thuhoarfhhfvh68@gmail.com. Please enter another email to continue." resource-id="com.facebook.katana:id/(name removed)" class="android.widget.TextView" package="com.facebook.katana" content-desc="Enter a new email address." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,336][1044,551]" />
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,587][1044,724]">
<node index="0" text="Email address" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.EditText" package="com.facebook.katana" content-desc="Email address" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[36,587][1044,724]" />
</node>
<node index="2" text="Update email address" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.Button" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,760][1044,889]" />
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,925][1044,1102]">
<node index="0" text="Confirm by phone number" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.Button" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,925][1044,1066]" />
</node>
<node index="4" text="" resource-id="" class="android.widget.LinearLayout" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,1102][1044,2058]">
<node index="0" text="" resource-id="com.facebook.katana:id/(name removed)" class="android.view.View" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[36,1102][1044,1900]" />
<node index="1" text="Not you?" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.TextView" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[437,1900][643,1983]" />
<node index="2" text="Log Out" resource-id="com.facebook.katana:id/(name removed)" class="android.widget.Button" package="com.facebook.katana" content-desc="Log Out" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[457,1983][622,2058]" />
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="android:id/statusBarBackground" class="android.view.View" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1080,108]" />
<node index="2" text="" resource-id="android:id/navigationBarBackground" class="android.view.View" package="com.facebook.katana" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][0,0]" />
</node>
</hierarchy>

正如建议的那样,这种情况可以使用文件层次结构来解决。由于我无法完全理解xml的层次结构,我想出了另一种方法:读取、搜索和替换该文件中的字符串。

这是我尝试过的一个简单的控制台应用程序(测试并运行;从文件中提取文本、边界和索引(:

internal class Program
{
internal static void Main(string[] args)
{
// Load file content
Console.WriteLine("Please specify input file...");
string? filePath = (@"" + Console.ReadLine()).Replace(@"""", null);
if (filePath == null || (!File.Exists(filePath)))
throw new ApplicationException("Specified file is not valid.");
string content = File.ReadAllText(filePath);
// Create a list<T> for each key you want extract
List<string> texts = new();
List<string> bounds = new();
List<int> indexes = new();
// ...
// Call ExtractValues for each key you want extract
ExtractValues(ref content, "text", ref texts);
ExtractValues(ref content, "bounds", ref bounds);
ExtractValues(ref content, "index", ref indexes);
// ...
// JOB DONE!
// Do whatever you want with the  lists (you could match the results in one single struct, for example)
}
private static void ExtractValues<T>(ref string fileContent, string findKey, ref List<T> targetList)
{
// Extract the sequence (e.g. SampleKey="sampleValue")
int sequenceStart = fileContent.IndexOf(findKey);
int valueStart = fileContent.IndexOf(@"""", sequenceStart + 1);
int fullLength = fileContent.IndexOf(@"""", valueStart + 1) + 1 - sequenceStart;
string fullSequence = fileContent.Substring(sequenceStart, fullLength);
// Extract the value (e.g. sampleValue)
string value = fullSequence[(findKey.Length + 2)..(fullSequence.Length - 1)];
// Add the value to the provided list, casting to T
targetList.Add((T)Convert.ChangeType(value, typeof(T)));
// Remove the sequence examinated so that the next run will find the next occurrence.
fileContent = fileContent.Remove(sequenceStart, fullLength);
// If there are still other occurrences of the same key, repeat recursively.
if (fileContent.IndexOf(findKey) > 0)
ExtractValues(ref fileContent, findKey, ref targetList);
}
}

也许这不是最优雅或最强大的解决方案,但它能完成任务,如果我需要的话,我会尝试它。

最新更新