gpt4 book ai didi

javascript - 使用 JavaScript 和正则表达式从文件中获取 XML 标记的最有效方法

转载 作者:行者123 更新时间:2023-11-29 15:42:03 25 4
gpt4 key购买 nike

我正在为一个企业应用程序在 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 似乎不支持它,我想我只是从文件中获取对,稍后再删减。

我可以用这个搜索 key :

// 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>"));

但是,当您将两者放在一起时,它(正则表达式语法)在终端上工作但在代码中不起作用:

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

我错过了什么?我也试过 grep 和 egrep 但没有任何运气。

最佳答案

这里有两个问题会影响您在 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>");

关于javascript - 使用 JavaScript 和正则表达式从文件中获取 XML 标记的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17650664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com