所以我有一个文件夹,里面装满了数据库的每个表格的html文件(自动生成)......
table/table1.html
table/table2.html
...
table/table200.html
我有一个包含以下数据的xml文件......
<?xml version="1.0" encoding="utf-8"?>
<tables>
<table1>This is the table1 table description.</table1>
<table2>This is the table2 table description.</table2>
...
<table200>This is the table200 table description.</table200>
</tables>
我希望创建一个批处理文件来读取此xml并将<div id="maintabs">
替换为<div id="tabledesc>This is the tableN table description we get from xml.</div><div id="maintabs">
。
我可以使用FART和xml.exe单独执行此操作,但我似乎无法使其动态工作并使用从xml.exe生成的值
非常感谢任何帮助。
为了清楚起见,我的要求是table1.html文件应该被修改为从xml文件中添加表table1数据,table2.html中包含table2标签数据,依此类推。
答案 0 :(得分:1)
每当您从XML或HTML操作或提取数据时,通常最好将其解析为XML或HTML,而不是试图从中删除一些文本。无论您的XML是否被美化或缩小,如果您将XML解析为XML,您的代码仍然有效。对于正则表达式或令牌搜索,不能说同样的内容。
Pure batch不能很好地处理XML和HTML DOM。但是,Windows Scripting Host会执行 - 带有Microsoft.XMLDOM
COM对象的XML,以及带有明确记录的htmlfile
COM对象的HTML。
无论如何,挑战:接受。用.bat扩展名保存,盐尝试并运行它。它是批处理+ JScript混合脚本。它使用XPath查询从XML文件的tableN
元素中获取与HTML文件的基本名称匹配的数据(请参阅底部的selectSingleNode('//' + basename + '/text()')
行);然后使用JavaScript-ish element.insertBefore
在保存更改目标html文件之前,将包含该数据的新DIV插入到HTML DOM中。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "xmlfile=test.xml"
set "htmlfolder=table\"
for %%I in ("%htmlfolder%\*.html") do cscript /nologo /e:JScript "%~f0" "%xmlfile%" "%%~fI"
rem // end main runtime
goto :EOF
@end
// end batch / begin JScript chimera
var XMLDOM = WSH.CreateObject('Microsoft.XMLDOM'),
HTMLDOM = WSH.CreateObject('htmlfile'),
fso = WSH.CreateObject('Scripting.FileSystemObject'),
htmlfile = fso.OpenTextFile(WSH.Arguments(1), 1),
html = htmlfile.ReadAll(),
htmltag = html.replace(/\r?\n/g,'').match(/<html.*?>/i)[0] + '\r\n',
doctype = /<!doctype/i.test(html) ? html.split(/<html/i)[0] : '',
target = WSH.Arguments(1).replace(/.*\\/, ''),
basename = target.split('.')[0];
HTMLDOM.write(html);
htmlfile.Close();
if (HTMLDOM.getElementById('tabledesc')) {
WSH.Echo(target + ' already modified.');
WSH.Quit(0);
} else WSH.StdOut.Write('processing ' + target + '... ');
with (XMLDOM) {
load(WSH.Arguments(0));
async = false;
setProperty('SelectionLanguage', 'XPath');
}
if (XMLDOM.parseError.errorCode) {
WSH.Echo(XMLDOM.parseError.reason);
WSH.Quit(1);
}
var tabledesc = HTMLDOM.createElement('div'),
XMLnode = XMLDOM.documentElement.selectSingleNode('//' + basename + '/text()');
if (!XMLnode) {
WSH.Echo('no XML data.');
WSH.Quit(0);
}
with (tabledesc) {
id = 'tabledesc';
innerHTML = XMLnode.data;
}
var htmlfile = fso.CreateTextFile(WSH.Arguments(1), true),
maintabs = HTMLDOM.getElementById('maintabs');
maintabs.parentNode.insertBefore(tabledesc, maintabs);
htmlfile.write(doctype + htmltag + HTMLDOM.documentElement.innerHTML + '\r\n</html>');
htmlfile.Close();
WSH.Echo('Done.');