您能帮我列出此文件中的浏览器吗? http://techpatterns.com/downloads/firefox/useragentswitcher.xml 进入txt文件,由%tab%delimiter?
分隔应该有3或4列:
1)示例数据中的文件夹描述:<folder description="Browsers - Windows">
2)来自示例数据的浏览器类型:<folder description="Legacy Browsers">
3)来自示例数据的用户代理:<useragent description="Avant Browser 1.2" useragent="Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)" app
我在这里看到第一个问题,因为某些浏览器不在文件夹<folder description="Legacy Browsers">"
中,而是在<separator/>
下
所以第一列应该定义系统,第二列是类型,第三列是浏览器。
下一个问题是Devises文件夹还包含一个文件夹。
@echo off
Setlocal EnableDelayedExpansion
SET file=useragentswitcher.xml
SET delim="
FOR /F "tokens=* skip=1" %%F IN (!file!) DO (
REM echo %%F
call :parse "%%F" > temp.txt
FOR /F "tokens=1,2,3,4,5,6,7 skip=1 delims=" %%A IN (temp.txt) DO (
IF "%%A"=="folder" (
SET /A level=!level!+1
echo Level:!level!
) ELSE IF "%%A"=="/folder" (
SET /A level=!level!-1
echo Level:!level!
)
echo A:%%A
)
pause
)
exit /b
:parse
Setlocal EnableDelayedExpansion
SET A=%*
REM REMOVE double paranthesis and <>
SET A=!A:~2,-2!
REM replace double qoutes
SET A=!A:"=µ!
FOR /F "tokens=1,2 delims=µ=" %%A IN ("!A!") DO (
SET first=%%A
SET second=%%B
echo !first!
FOR /F "tokens=1,2 delims= " %%A IN ("!first!") DO (
echo %%A
echo %%B
)
echo !second!
)
endlocal
exit /b
这解析了该行的一个标记,我现在将使用它。
答案 0 :(得分:5)
看起来你应该能够找到比批处理XML更好的工具......
但我相信下面的代码就是你要找的。
因为文件夹的数量不同,我交换了输出中列的顺序。我首先放置浏览器描述,然后是文件夹,每列一个。这样就可以修复每列的定义。
我使用了jeb答案中的信息,将"
作为FOR分隔符。
编辑 - 我简化了代码
注意 - 编写此第一次尝试是为了使用使用Internet Explorer检索的XML副本。我发现IE改变了文件的格式。此代码高度依赖于文件的确切格式,因此它不适用于原始XML。它还可以作为解释为什么批处理是解析XML的不良选择的一个例子
@echo off
setlocal enableDelayedExpansion
::Define the files to use - change as needed
set input="test.xml"
set output="result.txt"
::The assignment below should have exactly one TAB character between = and "
set "TAB= "
set cnt=0
set "folder0="
>%output% (
for /f usebackq^ tokens^=1^,2^ delims^=^=^" %%A in (%input%) do (
for %%N in (!cnt!) do (
if "%%A"=="- <folder description" (
set /a cnt+=1
for %%M in (!cnt!) do set "folder%%M=!folder%%N!%TAB%%%B"
)
if "%%A"==" </folder>" (
set /a cnt-=1
)
if "%%A"==" <useragent description" (
echo %%B!folder%%N!
)
)
)
)
如果!
出现在任何描述中,代码将失败,因为延迟扩展会破坏包含!
的任何FOR变量的扩展。我检查过,您的文件在任何说明中都不包含!
。
可以修改代码以在描述中处理!
,但它会变得更复杂。它需要打开和关闭延迟扩展,并在ENDLOCAL屏障上保留变量值。
上述代码高度依赖于XML的格式。如果删除非标准破折号,或者空格排列发生变化,则会失败。
以下变体更加健壮,但仍需要每行包含一个XML标记。
@echo off
setlocal enableDelayedExpansion
::Define the files to use - change as needed
set input="test.xml"
set output="result.txt"
::The assignment below should have exactly one TAB character between = and "
set "TAB= "
set cnt=0
set "folder0="
>%output% (
for /f usebackq^ tokens^=1^,2^ delims^=^=^" %%A in (%input%) do (
for %%N in (!cnt!) do (
set "test=%%A"
if "!test:<folder description=!" neq "!test!" (
set /a cnt+=1
for %%M in (!cnt!) do set "folder%%M=!folder%%N!%TAB%%%B"
)
if "!test:</folder>=!" neq "!test!" (
set /a cnt-=1
)
if "!test:<useragent description=!" neq "!test!" (
echo %%B!folder%%N!
)
)
)
)
编辑 - 最后一个版本
这是一个可以处理数据中!
的版本。我在输出中添加了一个额外的列。第一列仍然是浏览器描述。第二列是useragent字符串。其余列是文件夹。该解决方案使用延迟扩展切换技术。它还使用额外的FOR / F来保留ENDLOCAL屏障的变量值。
@echo off
setlocal disableDelayedExpansion
::Define the files to use - change as needed
set input="test.xml"
set output="result.txt"
::The assignment below should have exactly one TAB character between = and "
set "TAB= "
set cnt=0
set folder0=""
>%output% (
for /f usebackq^ tokens^=1-4^ delims^=^=^" %%A in (%input%) do (
set "test=%%A"
set "desc=%%B"
set "agent=%%D"
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
if "!test:<folder description=!" neq "!test!" (
set /a cnt+=1
for %%M in (!cnt!) do for /f "delims=" %%E in ("!folder%%N!") do (
endlocal
set "folder%%M=%%~E%TAB%%%B"
set "cnt=%%M"
)
) else if "!test:</folder>=!" neq "!test!" (
endlocal
set /a cnt-=1
) else if "!test:<useragent description=!" neq "!test!" (
echo !desc!%TAB%!agent!!folder%%N!
endlocal
) else endlocal
)
)
)
答案 1 :(得分:2)
检查MSDN-forum: Accessing Form1 controls from a different class - 脚本,该脚本可以通过给定的xpath表达式从xml获取值:
def choose_sepa_reason_code():
# This method is for providing proper sepa reason code
while True: #will provide permanent loop
sepa_reason_code = input("\nPlease provide SEPA reason code to reject the payment: ")
if sepa_reason_code in sepa_reason_codes:
return sepa_reason_code #stops loop and returns the reason code
else:
print("Your reason codes doesnt match the list:\n")
print(sepa_reason_codes)
答案 2 :(得分:1)
回答您的评论How should I use double quotes as delimiter?
只需使用表格
即可FOR /F tokens^=1^,2^ delims^=^" %%B IN ("%%A") DO
这是如何工作的?
通常,您不能使用引号字符作为分隔字符
这是唯一已知的解决方法,重要的是缺少FOR / F选项的正常引号。
但有必要将选项解析为只有一个标记,因此您需要转义所有标准的批处理解析器分隔符(空格标签=,;)。
引号不是批处理分隔符,但它也需要进行转义,以避免引用该行的其余部分,然后解析器将失败。
但您可以使用^"
更改""
,因为第二个引号将被忽略。
FOR /F tokens^=1^,2^ delims^="" %%B IN ("%%A") DO ...