我有一個像這樣的 XML 檔案:
<config>
<intensity>0</intensity>
<variables>
<variable>
<name>TONE</name>
<value>3</value>
<type>UNSIGNED8</type>
</variable>
<variable>
<name>V_SIC</name>
<value>0</value>
<type>UNSIGNED8</type>
</variable>
<variable>
<name>H_YPE</name>
<value>9000</value>
<type>INTEGER16</type>
</variable>
<variable>
<name>NUM_SIC</name>
<value>0</value>
<type>UNSIGNED8</type>
</variable>
</variables>
</config>
我正在嘗試從具有名稱的節點中獲取值文本H_YPE到變數中,因此在此示例中,變數應該具有9000. 如果節點H_YPE不在 XML 上,只需存盤 1。
我看到了這個答案并嘗試了Magoo實作的方法,雖然我可以看到正在決議這些值,但我有興趣只獲取一個值并將其存盤在一個變數中以供以后使用。
顯然我對批處理腳本不是很精通,所以任何和所有的幫助都將不勝感激,在此先感謝。
uj5u.com熱心網友回復:
由 Windows 命令處理器處理的批處理檔案cmd.exe是處理 XML 檔案的最差選擇,因為沒有對真正 XML 處理的內置支持。
如果 XML 檔案的結構始終如問題所示,則可以使用以下批處理檔案代碼。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Value=1"
if not exist "File.xml" goto ProcessValue
set "NameTagFound="
for /F "tokens=2,3 delims=<>" %%I in ('%SystemRoot%\System32\findstr.exe /R "<name>H_YPE</name> <value>[0123456789]*</value>" "File.xml"') do (
if "%%I" == "name" (
if /I "%%J" == "H_YPE" set "NameTagFound=1"
) else if defined NameTagFound (
if "%%I" == "value" (
if not "%%J" == "" set "Value=%%J"
goto ProcessValue
)
)
)
:ProcessValue
echo Value is: %Value%
endlocal
請注意以下對 XML 檔案中資料結構的要求:
- 開始標記必須有前導空格/制表符
<name>,<value>因為tokens=2,3 delims=<>和 這兩個元素必須位于不包含任何其他元素或屬性的單獨行上。 name具有值的元素H_YPE必須僅存在于元素內variable而不存在于另一個元素內,因為代碼不會檢查在<name>H_YPE</name>檔案中的位置。name具有 value的元素H_YPE必須位于該元素內,位于該元素variable所在行上方的單獨行上value。name因此,如果不調整代碼,value則無法更改元素的順序。- 具有 value的元素
variable的元素還必須具有在行下方的任何位置找到的元素或下一個元素的值with被錯誤地分配給環境變數,而不是使用默認值。nameH_YPEvaluevalue<name>H_YPE</name>Value1 - 該值
H_YPE必須始終位于具有此拼寫的 XML 檔案中(所有字母大寫)。
如果 XML 檔案內容不總是滿足五個要求之一,則可以增強代碼以執行更多 XML 結構檢查。
根據 XML 規范,XML 標記區分大小寫。因此,此代碼運行FINDSTR也區分大小寫,盡管該值H_YPE在任何情況下都可以根據 XML 規范。比較字串的IF條件也是區分大小寫的,原因相同,包括檢查 value的IFH_YPE條件。
要了解所使用的命令及其作業原理,請打開命令提示符視窗,在那里執行以下命令,并完整而仔細地閱讀每個命令顯示的幫助頁面。
echo /?endlocal /?findstr /?for /?goto /?if /?set /?setlocal /?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/515746.html
標籤:xml批处理文件
