使用JavaScript和Regex从文件中获取XML标记的最有效方法

特蕾莎·彼得斯(Teresa Peters)

我正在为企业应用程序在iOS设备和模拟器上进行一些更高级的自动化。自动化是用无浏览器的Javascript编写的。其中一种方法可在设备上运行,而不能在模拟器上运行,因此我需要编写一种解决方法。出于好奇,它是UIATarget.localTarget()。frontMostApp()。preferencesValueForKey(key)。

我们需要做的是从磁盘上的plist文件读取服务器的路径(不同)。作为模拟器的一种解决方法,我使用了以下几行来查找包含首选项的plist文件:

// Get the alias of the user who's logged in
var result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/whoami", [], 5).stdout;

// Remove the extra newline at the end of the alias we got
result = result.replace('\n',"");

// Find the location of the plist containing the server info
result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/find", ["/Users/"+result+"/Library/Application Support/iPhone Simulator", "-name", "redacted.plist"], 100);

// For some reason we need a delay here
UIATarget.localTarget().delay(.5);

// Results are returned in a single string separated by newline characters, so we can split it into an array
// This array contains all of the folders which have the plist file under the Simulator directory
var plistLocations = result.stdout.split("\n");

...

// For this example, let's just assume we want slot 0 here to save time
var plistBinaryLocation = plistLocations[0];
var plistXMLLocation =  plistLocations[i] + ".xml";
result = UIATarget.localTarget().host().performTaskWithPathArgumentsTimeout("/usr/bin/plutil", ["-convert","xml1", plistBinaryLocation,"-o", plistXMLLocation], 100);

从这里开始,我认为获取内容的最佳方法是cat或grep文件,因为我们无法直接从磁盘读取文件。但是,我在降低语法方面遇到困难。这是我正在读取的plist文件的编辑后的片段:

<key>server_url</key>
<string>http://pathToServer</string>

文件中有一堆密钥/字符串对,其中server_url密钥是唯一的。理想情况下,我会做类似回溯的事情,但是由于JavaScript似乎不支持它,所以我认为我只是从文件中取出一对,然后稍等一下。

我可以通过以下方式搜索密钥:

// This line works
var expression = new RegExp(escapeRegExp("<key>server_url</key>"));

if(result.stdout.match(expression))
{
    UIALogger.logMessage("FOUND IT!!!");
}
else
{
    UIALogger.logMessage("NOPE :(");
}

escapeRegExp方法如下所示:

function escapeRegExp(str) 
{
    var result =  str.replace(/([()[{*+.$^\\|?])/g, '\\$1');

    UIALogger.logMessage("NEW STRING: " + result);
    return result;
}

另外,此行返回一个值(但得到错误的行):

var expression = new RegExp(escapeRegExp("<string>(.*?)</string>"));

但是,将两者放在一起时,它(Regex语法)在终端上可用,但在代码中不起作用:

var expression = new RegExp(escapeRegExp("<key>server_url</key>[\s]*<string>(.*?)</string>"));

我想念什么?我也尝试了grep和egrep,但没有任何运气。

乔纳森·潘(Jonathan Penn)

在这里,有两个问题会影响您使正则表达式在JavaScript代码中起作用。

  • 首先,您要转义整个正则表达式表达式字符串,这意味着您的捕获(.*?)和空格忽略[\s]*也将被转义,并且不会按您期望的方式进行评估。您需要转义XML部分,并添加正则表达式部分而不转义它们。
  • 其次,空白忽略部分[\s]*正在成为JavaScript正常的字符串转义规则的牺牲品。在输出中,“ \ s”变成“ s”。您需要使用“ \ s”对反斜杠进行转义,以便在构造正则表达式时传递的字符串中将其保留为“ \ s”。

我已经构建了一个工作脚本,并已在UI自动化引擎中对其进行了验证。它应提取并打印出预期的URL:

var testString = "" +
"<plistExample>\n" +
"   <key>dont-find-me</key>\n" +
"   <string>bad value</string>\n" +
"   <key>server_url</key>\n" +
"   <string>http://server_url</string>\n" +
"</plistExample>";

function escapeRegExp(str) 
{
    var result =  str.replace(/([()[{*+.$^\\|?])/g, '\\$1');

    UIALogger.logMessage("NEW STRING: " + result);
    return result;
}

var strExp = escapeRegExp("<key>server_url</key>") + "[\\s]*" + escapeRegExp("<string>") + "(.*)" + escapeRegExp("</string>");

UIALogger.logMessage("Expression escaping only the xml parts:" + strExp);

var exp = new RegExp(strExp);
var match = testString.match(exp);

UIALogger.logMessage("Match: " + match[1]);

不过,我应该指出,您需要在正则表达式中转义的唯一事情是XML结束标记中的正斜杠。这意味着您不需要escapeRegExp()函数,可以编写所需的表达式,如下所示:

var exp = new RegExp("<key>server_url<\/key>[\\s]*<string>(.*)<\/string>");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

添加和删除文件而不完全重写文件的最有效方法是什么?

来自分类Dev

获取任意大数字位数的最有效方法

来自分类Dev

基于R中的顺序值标记组的最有效方法

来自分类Dev

使用PHP获取字母表中前一个字母的最有效方法

来自分类Dev

在numpy中获取日志返回的最有效方法是什么

来自分类Dev

在Elixir中搜索文件中字节模式的最有效方法

来自分类Dev

从对象列表中获取具有最大值的对象的最有效方法

来自分类Dev

使用bash删除旧文件的最有效方法

来自分类Dev

使用JavaScript对象构建菜单的最有效方法

来自分类Dev

在JavaScript中搜索数组映射的最有效方法

来自分类Dev

在xml文件中寻找价值的最有效方法?

来自分类Dev

在R?中排序向量中获取索引的最有效方法?

来自分类Dev

用JavaScript修剪文件名的最有效方法

来自分类Dev

确保Javascript中顺序命令的最有效方法

来自分类Dev

获取整数的循环和的最有效方法是什么?

来自分类Dev

获取数字总和的最有效方法是什么?

来自分类Dev

在javascript中获取数字的最低有效位的最有效方法是什么?

来自分类Dev

使用和与多个线程通信的最有效方法

来自分类Dev

允许用户使用mysql标记页面(id,节点等)的最有效方法是什么?

来自分类Dev

从多个XML文件读取两个节点的最有效方法?

来自分类Dev

读取和编辑xml文件的最有效方法

来自分类Dev

在HTML,CSS和JavaScript中创建“滑块”时间轴的最有效方法?

来自分类Dev

MySQL:从尝试插入获取ID的最有效方法?

来自分类Dev

在Bash中搜索文本文件中多个术语的最有效方法

来自分类Dev

在JavaScript中搜索数组映射的最有效方法

来自分类Dev

将if语句放入javascript标记内的phtml文件中的有效方法

来自分类Dev

从Laravel BLADE中的集合中获取特定模型的最有效方法

来自分类Dev

在文件中更改1行的最有效方法

来自分类Dev

获取特定 XML 节点元素的最有效方法

Related 相关文章

  1. 1

    添加和删除文件而不完全重写文件的最有效方法是什么?

  2. 2

    获取任意大数字位数的最有效方法

  3. 3

    基于R中的顺序值标记组的最有效方法

  4. 4

    使用PHP获取字母表中前一个字母的最有效方法

  5. 5

    在numpy中获取日志返回的最有效方法是什么

  6. 6

    在Elixir中搜索文件中字节模式的最有效方法

  7. 7

    从对象列表中获取具有最大值的对象的最有效方法

  8. 8

    使用bash删除旧文件的最有效方法

  9. 9

    使用JavaScript对象构建菜单的最有效方法

  10. 10

    在JavaScript中搜索数组映射的最有效方法

  11. 11

    在xml文件中寻找价值的最有效方法?

  12. 12

    在R?中排序向量中获取索引的最有效方法?

  13. 13

    用JavaScript修剪文件名的最有效方法

  14. 14

    确保Javascript中顺序命令的最有效方法

  15. 15

    获取整数的循环和的最有效方法是什么?

  16. 16

    获取数字总和的最有效方法是什么?

  17. 17

    在javascript中获取数字的最低有效位的最有效方法是什么?

  18. 18

    使用和与多个线程通信的最有效方法

  19. 19

    允许用户使用mysql标记页面(id,节点等)的最有效方法是什么?

  20. 20

    从多个XML文件读取两个节点的最有效方法?

  21. 21

    读取和编辑xml文件的最有效方法

  22. 22

    在HTML,CSS和JavaScript中创建“滑块”时间轴的最有效方法?

  23. 23

    MySQL:从尝试插入获取ID的最有效方法?

  24. 24

    在Bash中搜索文本文件中多个术语的最有效方法

  25. 25

    在JavaScript中搜索数组映射的最有效方法

  26. 26

    将if语句放入javascript标记内的phtml文件中的有效方法

  27. 27

    从Laravel BLADE中的集合中获取特定模型的最有效方法

  28. 28

    在文件中更改1行的最有效方法

  29. 29

    获取特定 XML 节点元素的最有效方法

热门标签

归档