gpt4 book ai didi

javascript - 使用 RegExp 和 exec 在 JavaScript 中解析 XML - 它通常可以工作,但在少数情况下却不能 - 知道为什么吗?

转载 作者:行者123 更新时间:2023-12-02 13:45:23 29 4
gpt4 key购买 nike

我正在服务器端 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/

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