批處理新手入門導讀[視頻教程]批處理基礎視頻教程[視頻教程]VBS基礎視頻教程
[批處理文件精品]批處理版照片整理器[批處理文件精品]純批處理備份&還原驅動在線第三方下載
返回列表 發帖

【解決】40元求xml信息獲取

本帖最后由 lxh623 于 2020-9-12 07:42 編輯

http://www.309783.tw/thread-56119-1-1.html
上次求了一次,覺得不夠用。
第一,上一次的加上一個字段——篇名。(xml名字)有時候想找字。
第二,關于悉曇字和蘭札字。
  1. <char xml:id="SD-A442">
  2. <charName>CBETA CHARACTER SD-A442</charName>
  3. <charProp>
  4. <localName>Romanized form in CBETA transcription</localName>
  5. <value>ki</value>
  6. </charProp>
  7. <charProp>
  8. <localName>Character in the Siddham font</localName>
  9. <value>丁</value>
  10. </charProp>
  11. <charProp>
  12. <localName>Romanized form in Unicode transcription</localName>
  13. <value>ki</value>
  14. </charProp>
  15. <mapping cb:dec="1066050" type="PUA">U+104442</mapping>
  16. </char>
  17. <char xml:id="RJ-CAC5">
  18. <charName>CBETA CHARACTER RJ-CAC5</charName>
  19. <charProp>
  20. <localName>Romanized form in CBETA transcription</localName>
  21. <value>hri</value>
  22. </charProp>
  23. <charProp>
  24. <localName>rjchar</localName>
  25. <value>岒</value>
  26. </charProp>
  27. <charProp>
  28. <localName>Romanized form in Unicode transcription</localName>
  29. <value>hri</value>
  30. </charProp>
  31. <mapping cb:dec="1100485" type="PUA">U+10CAC5</mapping>
  32. </char>
復制代碼
第一個來自于T21n1320,第二個是T21n1419。
除了篇名,字符名,還有四個值。
還想要一個值,就是正文,得到字符名稱后,搜索。比如,<g ref="#RJ-CB60">&#1100640;</g>或者<g ref="#SD-A44A">&#1066058;</g>。這一串或者中間的值,都可以。
結果當然需要UTF8。而且這個字符是亂碼。仍然得到,主要是以后可以替換。

謝謝!

奇怪,瀏覽器亂碼顯示的數字大概就是最后一個字段括號內的數字,但是,替換的話,可能最好提取內容。

完全看不懂要提取什么,發圖示標明提取位置并把測試文件打包上傳或發網盤
提供bat代寫,為你省時省力省事,支付寶掃碼頭像支付
QQ: 956535081

TOP

本帖最后由 lxh623 于 2020-9-11 14:05 編輯

回復 2# zaqmlp

鏈接:https://pan.baidu.com/s/1YxgNeeQUNBCl0Iz5bNvkoQ
提取碼:ix0w

與上次一樣,得到excel。
篇名,字符名,三個<value>,最后一個PUA后面的值。
<char xml:id="SD-A442">得到字符名,正文有一段代碼。

或者,上次的補加一些字段。

這次專門做一個搜索<g ref="#RJ-CB60">&#1100640;</g>,得到所有類似的代碼。

謝謝!

TOP

本帖最后由 zaqmlp 于 2020-9-11 22:18 編輯

回復 3# lxh623
  1. <# :
  2. cls
  3. @echo off
  4. cd /d "%~dp0"
  5. powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::Default))) -Args '%~dp0'"
  6. pause
  7. exit
  8. #>
  9. $path=$args[0];
  10. $outfile=$path+'#result.csv';
  11. $enc=[Text.Encoding]::UTF8;
  12. $fs=New-Object System.IO.FileStream($outfile, [System.IO.FileMode]::Create);
  13. $sw=New-Object System.IO.StreamWriter($fs, $enc);
  14. [email protected](dir -liter $path -recurse|?{('.xml' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
  15. for($i=0;$i -lt $files.length;$i++){
  16.   write-host $files[$i].FullName;
  17.   $text=[IO.File]::ReadAllText($files[$i].FullName, $enc);
  18.   $m1=[regex]::matches($text, '<char xml:id="([^"]*?)">([\s\S]+?)</char>');
  19.   if($m1.count -ge 1){
  20.   foreach($k in $m1){
  21.     [email protected]($files[$i].BaseName,'','','','','','','','','');
  22.    
  23.     $a=$k.groups[1].value;
  24.     $arr[1]=$a;
  25.     $b=[regex]::match($k.groups[2].value,'[^>]+(?=</charName>)');
  26.     if($b.success){$arr[2]=$b.groups[0].value;};
  27.    
  28.     $m2=[regex]::matches($k.groups[2].value, '(?<=<value>).+?(?=</value>)');
  29.     $n=3;
  30.     if($m2.count -ge 1){
  31.         foreach($v in $m2){
  32.             $arr[$n]=$v.groups[0].value;
  33.             $n++;
  34.         };
  35.     };
  36.    
  37.     $f=[regex]::match($k.groups[2].value,'<mapping type="[^"]*?unicode">([\s\S]+?)</mapping>');
  38.     if($f.success){$arr[6]=$f.groups[1].value;};
  39.    
  40.     $g=[regex]::match($k.groups[2].value,'type="PUA">([\s\S]+?)</mapping>');
  41.     if($g.success){$arr[7]=$g.groups[1].value;};
  42.    
  43.     $h=[regex]::match($k.groups[2].value,'cb:dec="([^"]+?)".+?type="PUA"');
  44.     if($h.success){$arr[8]=$h.groups[1].value;};
  45.    
  46.     $reg='<g ref="#'+$a+'">(.+?)</g>'
  47.     $p=[regex]::match($text, $reg);
  48.     if($p.success){$arr[9]=$p.groups[1].value;};
  49.    
  50.     $line=$arr -join ',';
  51.     $sw.WriteLine($line);
  52.     $sw.Flush();
  53.   };
  54.   };
  55. };
  56. $sw.Close();
  57. $fs.Close();
復制代碼
1

評分人數

提供bat代寫,為你省時省力省事,支付寶掃碼頭像支付
QQ: 956535081

TOP

本帖最后由 WHY 于 2020-9-17 16:26 編輯

保存為 E:\XML\Test.ps1
運行方法:腳本用右鍵單擊,選擇 "使用 PowerShell 運行"
或者,在 cmd 命令行下,輸入 PowerShell -exec bypass "&'E:\XML\Test.ps1'" 回車運行
  1. $srcDir  = 'E:\xml';              #存放xml文件的目錄路徑
  2. $dstFile = 'E:\xml\Result.csv';   #輸出文件路徑
  3. $xml = New-Object System.XML.XmlDocument;
  4. $fs  = New-Object System.IO.StreamWriter($dstFile, $false, [Text.Encoding]::UTF8);
  5. $files = dir -Literal $srcDir -Filter *.xml -Recurse | ?{$_ -is [IO.FileInfo]}
  6. $count = $files.Count;
  7. for($i=0; $i -lt $count; $i++){
  8.     $xml.load($files[$i].FullName);
  9.     $hash = @{};
  10.     forEach( $node In $xml.GetElementsByTagName('g') ){
  11.         $key = $node.ref;
  12.         if( !$hash.ContainsKey($key) ){ $hash[$key] = $node.innerText; }
  13.     }
  14.     forEach( $node In $xml.GetElementsByTagName('char') ){
  15.         $arr  = @($files[$i].BaseName, '0', '0', '0', '0', '0', '0', '0', '0');
  16.         $k = 3; $id = $node.id;
  17.         if( $id -ne $null ) { $arr[1] = $id; }
  18.         if( $node.charName -ne $null ) { $arr[2] = $node.charName; }
  19.         $k = 3;
  20.         forEach( $prop In $node.charProp ) {
  21.             $value = $prop.value;
  22.             if( $value -ne $null ) { $arr[$k++] = $value; }
  23.         }
  24.         forEach( $mapp In $node.mapping ) {
  25.             $type = $mapp.type;
  26.             if( $type -ne $null ) {
  27.                 if( $type.EndsWith('unicode') ){
  28.                     $arr[6] = $mapp.innerText;
  29.                 } elseif( $type -eq 'PUA' ){
  30.                     $arr[7] = $mapp.innerText;
  31.                 }
  32.             }
  33.         }
  34.         if( $hash.ContainsKey('#' + $id) ){ $arr[8] = $hash['#' + $id]; }
  35.         $fs.WriteLine('"' + ($arr -join  '","') + '"' );
  36.     }
  37.     if($i % 500 -eq 0 ) { $fs.Flush(); }
  38. }
  39. $fs.Flush();
  40. $fs.Dispose();
  41. echo 'Done'
  42. [console]::ReadLine();
復制代碼
共9列:文件名,id,charName,value,value,value,unicode,PUA,搜索結果g
  1. $srcDir  = 'E:\xml';              #存放xml文件的目錄路徑
  2. $dstFile = 'E:\xml\Result.csv';   #輸出文件路徑
  3. $xml = New-Object System.XML.XmlDocument;
  4. $fs  = New-Object System.IO.StreamWriter($dstFile, $false, [Text.Encoding]::UTF8);
  5. $files = dir -Literal $srcDir -Filter *.xml -Recurse | ?{$_ -is [IO.FileInfo]}
  6. $count = $files.Count;
  7. for($i=0; $i -lt $count; $i++){
  8.     $xml.load($files[$i].FullName);
  9.     $mgrNS = New-Object System.XML.XmlNameSpaceManager($xml.NameTable);
  10.     $mgrNS.AddNameSpace('ns', $xml.DocumentElement.NameSpaceURI);    #xml命名空間
  11.     forEach( $node In $xml.SelectNodes('//ns:char', $mgrNS) ){
  12.         $arr = @($files[$i].BaseName, '0', '0', '0', '0', '0', '0', '0', '0');
  13.         $id  = $node.id;
  14.         if( $id -ne $null ) { $arr[1] = $id; }                        #第2列:id
  15.         if( $node.charName -ne $null ) { $arr[2] = $node.charName; }  #第3列:charName
  16.         $k = 3;
  17.         forEach( $prop In $node.charProp) {
  18.             $value = $prop.value;
  19.             if( $value -ne $null ) { $arr[$k++] = $value; }           #第4-6列:value
  20.         }
  21.         forEach( $mapp In $node.mapping ) {
  22.             $type = $mapp.type;
  23.             if( $type -ne $null ) {
  24.                 if( $type.EndsWith('unicode') ){
  25.                     $arr[6] = $mapp.innerText;          #第7列:type='unicode'對應的文字
  26.                 } elseif( $type -eq 'PUA' ){
  27.                     $arr[7] = $mapp.innerText;          #第8列:type='PUA'對應的文字
  28.                 }
  29.             }
  30.         }
  31.         $g = $xml.SelectSingleNode('//ns:g[@ref="#' + $id + '"]', $mgrNS);
  32.         $text = $g.innerText;
  33.         if( $text -ne $null ){ $arr[8] = $text; }       #第9列:節點g屬性ref="#id"對應的文字
  34.         $fs.WriteLine('"' + ($arr -join  '","') + '"' );
  35.     }
  36.     if($i % 500 -eq 0 ) { $fs.Flush(); }
  37. }
  38. $fs.Flush();
  39. $fs.Dispose();
  40. echo 'Done';
  41. [console]::ReadLine();
復制代碼
1

評分人數

TOP

本帖最后由 lxh623 于 2020-9-12 07:25 編輯

謝謝兩位。

TOP

返回列表
重庆时时开奖直播软件