0

I am learning to use C#. and I have a file window_dump.xml. I need to extract the required data to a specific list as follows:


text=""|bounds="[0,0][1080,2076]"
text="Not you?"|bounds="[437,1900][643,1983]"
text="Log Out"|bounds="[457,1983][622,2058]"
....
text=""|bounds="[0,264][1080,2076]"


Here is the entire content of the xml file: 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>
Markus Meyer
  • 3,327
  • 10
  • 22
  • 35

1 Answers1

1

As suggested, tipically this situation could be resolved using file hierarchy. Since I wasn't able to fully understand the hierarchy from your xml, I figured out another way: reading, searching and replacing strings in that file.

Here's a simple Console App that I tried (tested and working; extracts texts, bounds and indexes from your file):

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);
    }
}

Maybe this is not the most elegant or powerful solution, but it does the job and is the one I would have tried if I needed it.

IFrank
  • 419
  • 1
  • 5
  • 12
  • 1
    +1 for a nice workaround. Not every problem is worth solving directly, sometimes a reusable workaround is the best option – ephraim Aug 15 '22 at 20:12
  • @ephraim I totally agree with you. Glad it helped! – IFrank Aug 15 '22 at 20:25
  • i get error at this line " string value = fullSequence[(findKey.Length + 2)..(fullSequence.Length - 1)];" stay in place .. CS1001 Identifier expected – vinh nguyen Aug 16 '22 at 01:27
  • @FrankProp for example my xml file is in "C:\test.xml" what is the complete code, help me, because i got error when using above code – vinh nguyen Aug 16 '22 at 03:44
  • @ephraim I double checked the code I posted and it's working. What C# version are you using? Did you copy the entire code snippet? – IFrank Aug 16 '22 at 08:08