- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在服务器端 JavaScript 中解析一些 XML。 XML 通过调用另一台服务器返回。我正在使用在 With regex how do i match between an XML tag multiple times? 找到的解决方案的修改版本并使用测试仪在 http://www.regular-expressions.info/javascriptexample.html 测试了 RegExp .
返回了大约 1280 条记录,并且几乎一直有效。但今天我注意到大约 30 条记录无法正确解析。有些字段在解析时最终为空,我不明白为什么。
我在循环中创建的正则表达式示例是
<field name="URL_ProProfs"><data>(.+?)<\/data><\/field>
我正在解析的记录示例是
<record mod-id="439" record-id="6640">
<field name="Name">
<data>Inviting Young Children to Explore Process Art</data>
</field>
<field name="Byline_Presenter">
<data> Presented by MaryAnn F. Kohl, Author, Educator, and Presenter </data>
</field>
<field name="Date">
<data>11/14/2016</data>
</field>
<field name="URL_On_Demand">
<data> https://www.anymeeting.com/843-066-411/E954DB85814B38 </data>
</field>
<field name="URL_ProProfs">
<data> https://www.proprofs.com/quiz-school/story.php?title=quiz-18-classroommanagementwebinar20161114_3WO </data>
</field>
<field name="Status">
<data>1</data>
</field>
<field name="URL_Blog">
<data> http://home.edweb.net/webinar/young-children-explore-process-art/ </data>
</field>
<field name="Channel_1">
<data>Arts in Education</data>
</field>
<field name="Channel_2">
<data>Early Childhood Learning</data>
</field>
<field name="Channel_3">
<data/>
</field>
<field name="Channel_4">
<data/>
</field>
<field name="Name_Community">
<data>classroommanagement</data>
</field>
<field name="Webinars_COMMUNITIES::Name_Long">
<data>Classroom Management for Early Learning</data>
</field>
<field name="_ID_Community">
<data>.5a1dcfde</data>
</field>
</record>
如果我在测试器上使用带有该字符串的 RegExp,它会正确解析,并且我能够找到该字段的返回值作为 .exec 数组结果的第二个元素:
https://www.proprofs.com/quiz-school/story.php?title=quiz-18-classroommanagementwebinar20161114_3WO
但有时,由于某些我无法理解的原因,我会为我正在解析的不同字段返回空值。在本例中,对于字段 URL_ProfProps。
我正在使用以下循环对 RegExp 执行 exec 以查找记录中的所有值。每个记录都会调用该函数本身。
function webinarParse(record) {
var r = new Object();
var fields = ["Name", "Byline_Presenter", "Date", "URL_On_Demand", "URL_Blog", "URL_ProProfs", "Name_Community", "Webinars_COMMUNITIES::Name_Long", "Channel_1",
"Channel_2", "Channel_3", "Channel_4", "_ID_Community"];
for (f=0; f<fields.length; f++) {
var re = new RegExp('<field name="' + fields[f] + '"><data>(.+?)<\/data><\/field>');
var m = re.exec(record);
if (m == null) {
r[fields[f]] = "";
} else {
if (fields[f] == 'Date') {
r[fields[f]] = new Date(m[1]);
}
else {
if (m[1].indexOf('<data>') != -1) {
// greedy match captured from next field when there was no data present
r[fields[f]] = "";
}
else {
r[fields[f]] = m[1];
}
}
}
}
return r;
}
参数记录是我返回的所有 XML 记录中的一条记录。
Object() r 是我的返回值。
Array() 字段是我正在解析的值列表。
在循环中,我为字段的每个元素创建一个新的 RegExp,以查看是否有可返回的值。
如果 re.exec(record) 为 null,我只需在 r 中为该属性设置一个空字符串。
如果该字段恰好是日期字符串,我会为该属性设置一个 Date 对象。
那么我必须小心,因为 XML 正在返回
<data />
如果没有数据,而不是
<data></data>
所以我检查了一下。也就是说,有数据就应该有
<data>
标签。如果没有,我不想抢太多。
我正在记录每条记录的解析,它在 1280 次中工作了大约 1250 次。但对于某些记录,其中一两个字段无法解析,即使我确认 XML 本身中有数据。
上面的示例似乎在测试器页面上正确解析,但在我的循环中,URL_ProPofs 的值返回空值。
对我的正则表达式或循环执行此操作有什么想法吗?我只是不明白为什么它有时找不到值(value)。
谢谢。
最佳答案
简短的回答:使用 XPath/XQuery 查询和访问 XML 文档中的数据,它将为您提供更大的灵 active 并摆脱特定情况,例如它们是为此目的而设计的。
对于正则表达式,'.'
不匹配新行,因此需要添加 \r
和\n
并且还为 <field...>
之间的任何内容添加匹配和<data...>
以及 </data>
之间和</field>
.
完成所有这些,你最终会得到像这样的正则表达式
<field name="URL_ProProfs">[\s\n\r]*?<data>((?:.|[\n\r])*?)<\/data>[\s\r\n]*?<\/field>
这是一个工作示例:https://regex101.com/r/07xgks/4但请记住,只有当数据中没有嵌套数据、xml 有效等等时,这才有效......
关于javascript - 使用 RegExp 和 exec 在 JavaScript 中解析 XML - 它通常可以工作,但在少数情况下却不能 - 知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439888/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!