如何解决正则表达式/解析XML文件
| 我有一个XML文件,其中包含自定义标签包含的一堆数据。这对于我拥有的一个项目都很有用,但是对于另一个项目,我不需要太多信息。因此,我想修剪XML文件,并摆脱某些标签的所有实例以及这些标签之间的所有内容。<GOBJ>
<cost>4</cost>
<duration>n/a</duration>
<item>Stone Block</item>
<type>Construction - Material</type>
<misc>Use these blocks to build things. These blocks don\'t degrade.</misc>
</GOBJ>
我只想保留[item]blah[item]
和[type]blah[type]
,其余的应该删除/删除。
稍后,我将需要检查[type]
的文本并替换与某些单词匹配的内容。例如,如果“金属”一词在[type]
标签内的任何位置,则仅用金属一词替换该标签的内容。
我知道这是一个很大的要求;感谢您的帮助。
解决方法
另一种方法是仅使用简单的XML→XML(具有XPath 1.0的XSLT 1.0)转换,如下所示。可以轻松适应您的要求并重复使用其他文档。
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">
<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" indent=\"yes\"/>
<xsl:template match=\"root\">
<root>
<xsl:apply-templates select=\"GOBJ\"/>
</root>
</xsl:template>
<xsl:template match=\"GOBJ\">
<GOBJ>
<xsl:copy-of select=\"item\"/>
<type>
<xsl:choose>
<xsl:when test=\"contains(type,\'metal\')\">
<xsl:text>metal</xsl:text>
</xsl:when>
<!-- other xsl:when conditions here -->
<xsl:otherwise>
<xsl:value-of select=\"type\"/>
</xsl:otherwise>
</xsl:choose>
</type>
</GOBJ>
</xsl:template>
</xsl:stylesheet>
我知道这不是基于正则表达式的解决方案,但是恕我直言,最好使用面向XML的本机工具箱。
, 假设文件的布局与您的示例完全相同,并乘以所需的尽可能多的记录,并且您希望保留尽可能多的原始布局,请替换
(<GOBJ>[^<]+?).+?(<item>.+?<\\/type>\\n).+?(<\\/GOBJ>)
与
$1$2$3
在全局范围内,将正则表达式设置为在\'singleline \'模式下运行,将满足您的要求,仅当元素<GOBJ>
为大写字母,其他元素为小写字母时,每条记录每个元素只有一个实例,而元素<item>
始终出现在每个记录中元素“ 10”的紧前面。
在JavaScript中,这将是:
var result = src.replace(
/(<GOBJ>[^<]+?).+?(<item>.+?<\\/type>\\n).+?(<\\/GOBJ>)/g,\'$1$2$3\'
);
注意,严格的条件减轻了与使用正则表达式解析XML有关的所有问题。如果不能满足这些条件,则使用XML专用工具(如XSLT)将为您提供更好的服务。
, 这是一个grep解决方案:grep -E \'(<item>|<type>)\' myfile.xml
, 我开发了另一种解决问题的方法;我构建了一个jquery脚本,该脚本拆分了xml代码(我之前用不同的符号替换了所有左/右箭头),并且如果我不包含其他某些符号,则输出数组项。
var name = $(\'div\').text().trim().split(/\\[name\\](.*?)\\[\\/name\\]/g);
var type = $(\'div\').text().trim().split(/\\[type\\](.*?)\\[\\/type\\]/g);
for (i = 0; name.length > i; i++) {
if ((type[i].match(/\\[/g))) {
type[i] = \"\";
}
if (!(name[i].match(/\\[/g))) {
if (type[i].match(/construction/g)) {type[i] = \"T_C\";}
if (type[i].match(/material/g)) {type[i] = \"T_M\";}
if (type[i].match(/metalwork/g)) {type[i] = \"T_W\";}
if (type[i].match(/water/g)) {type[i] = \"T_W\";}
if (type[i].match(/oil/g)) {type[i] = \"T_O\";}
if (type[i].match(/precious/g)) {type[i] = \"T_P\";}
if (type[i].match(/magic/g)) {type[i] = \"T_M\";}
$(\'.Collect\').append(\'<p>a href=\"../Img/XXX/\' + name[i] + \'.jpg\" class=\"\' + type[i] + \'\">\' + name[i] + \'/a></p>\');
} else {
name[i] = \"\";
}
}
以这种方式格式化输出,以便我可以将页面复制粘贴到txt / html文件中,并按我的需要进行复制。我必须想办法用适当的目录名称替换XXX ...
我只需要执行一次或两次,因此纯自动化不是必须的。
, 如果要解析XML日志文件,则可以使用正则表达式{java},为<[^<]+<
。因此,您将获得<name>DEV</name>
。输出类似于name> DEV。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。