更新.html文件以在批处理中添加来自xml文件的div内容

时间:2015-03-31 13:57:18

标签: xml batch-file

所以我有一个文件夹,里面装满了数据库的每个表格的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">

我可以使用FARTxml.exe单独执行此操作,但我似乎无法使其动态工作并使用从xml.exe生成的值

非常感谢任何帮助。

为了清楚起见,我的要求是table1.html文件应该被修改为从xml文件中添加表table1数据,table2.html中包含table2标签数据,依此类推。

1 个答案:

答案 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.');