标题: [问题求助] 请求PowerShell: 根据XML文件结点获取对应文件夹内的html文件内容 [打印本页]
作者: 5i365 时间: 2022-3-15 09:24 标题: 请求PowerShell: 根据XML文件结点获取对应文件夹内的html文件内容
下面的XML文件中的结点结构 和 文件夹内的文件结构是相互对应的!
我想根据XML文件中的某个结点的url值获取对应文件夹内的html文件内容,随后将内容写入到XML对应节点的位置【如果这个位置有值则替换掉】,具体描述如下:
例如: 下面二楼XML文件中的红色字部分就是存在url值的结点,这个url值的文件夹内有一个html文件,
获取这个文件的内容,然后将内容插入到该结点上方的 NotesGroup\NotesXhtmlData 结点中, 蓝色字部分就是插入后的示例, 因为贴子字数限制只标记了一个蓝色区域
要遍历所有存在url值的结点,并插入内容, 我通过下面的方法取到了结点值, 但是编程水平水限, 求高手引路, 非常感谢!
示例文件: https://send.cm/d/9RzN
用下面的方法可以查询如下两个结点路径:
$xmldata = [xml](Get-Content Document.xml -enc UTF8)
#顶级\一级1
$xmldata.Map.OneTopic.Topic.SubTopics.Topic[0].Hyperlink
#顶级\一级2
$xmldata.Map.OneTopic.Topic.SubTopics.Topic[1].Hyperlink
xml结点很有规律,录了一个gif演示
_____________________________________________________________________________
文件夹结构:
C:\USERS\ADMINISTRATOR\DESKTOP\顶级
├─一级1
│ │ A.html
│ │
│ └─二级1
│ │ A.html
│ │
│ └─三级2
│ A.html
│
└─一级2
│ A.html
│
└─二级1
│ A.html
│
└─三级1
A.html
作者: 5i365 时间: 2022-3-15 09:25
本帖最后由 5i365 于 2022-3-15 10:43 编辑
XML文件内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ap:Map Dirty="0000000000000001" Gen="0000000000000000" xmlns:ap="www.w3.org" xmlns:cor="www.w3.org" xmlns:pri="www.w3.org" xmlns:xsi="www.w3.org" >
<cor:Custom Index="0" Dirty="0000000000000001" />
<ap:OneTopic>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<cor:Custom Index="0" Dirty="0000000000000001" />
<ap:SubTopics>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:SubTopics>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:SubTopics>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="三级2" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级1\二级1\三级2 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级1\二级1\三级2 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级1\二级1\三级2" />
</ap:Topic>
</ap:SubTopics>
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="二级1" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级1\二级1 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级1\二级1 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级1\二级1" />
</ap:Topic>
</ap:SubTopics>
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="一级1" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级1 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级1 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Offset Dirty="0000000000000001" CX="30." CY="0."/>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级1" />
</ap:Topic>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:SubTopics>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:SubTopics>
<ap:Topic Dirty="0000000000000001" Gen="0000000000000000">
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="三级1" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级2\二级1\三级1 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级2\二级1\三级1 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级2\二级1\三级1" />
</ap:Topic>
</ap:SubTopics>
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="二级1" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级2\二级1 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级2\二级1 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级2\二级1" />
</ap:Topic>
</ap:SubTopics>
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="一级2" ReadOnly="false">
<ap:Font/>
</ap:Text>
<ap:NotesGroup>
<ap:NotesXhtmlData Dirty="0000000000000001" PreviewPlainText="我是 C:\Users\Administrator\Desktop\顶级\一级2 下的html文件">
<html
xmlns="http://www.w3.org/1999/xhtml">
<p>我是 C:\Users\Administrator\Desktop\顶级\一级2 下的html文件</p>
</html>
</ap:NotesXhtmlData>
</ap:NotesGroup>
<ap:Offset Dirty="0000000000000001" CX="30." CY="0."/>
<ap:Hyperlink Url="C:\Users\Administrator\Desktop\顶级\一级2" />
</ap:Topic>
</ap:SubTopics>
<ap:TopicViewGroup ViewIndex="0">
<ap:Collapsed Collapsed="false" Dirty="0000000000000000"/>
</ap:TopicViewGroup>
<ap:Text Dirty="0000000000000001" PlainText="顶级" ReadOnly="false">
<ap:Font/>
</ap:Text>
</ap:Topic>
</ap:OneTopic>
</ap:Map>
作者: 5i365 时间: 2022-3-15 12:51
本帖最后由 5i365 于 2022-3-15 14:32 编辑
查询结点路径,已经用下面的代码找到了!
但编程水平水限,还有两个重要的问题没解决:
1.不知道如何遍历取所有的值, 因为各个URL值在不同的级别上,
2.取到值后,还要将值设置到同一父结点的NotesGroup子结点下的NotesXhtmlData结点下
在百度也没搜索到有参考性的资料,求路过高手支招, 感谢!
$xmldata = [xml](Get-Content Document.xml -enc UTF8)
#顶级\一级1
$xmldata.Map.OneTopic.Topic.SubTopics.Topic[0].Hyperlink
#顶级\一级2
$xmldata.Map.OneTopic.Topic.SubTopics.Topic[1].Hyperlink
作者: went 时间: 2022-3-15 20:31
$xmldata.GetElementsByTagName('ap:Hyperlink')
作者: 5i365 时间: 2022-3-15 21:23
回复 4# went
大侠真是牛X, 一招制敌, 取到了所有路径
下面这第二点,一点头绪都没有
2.取到路径值后,还要将路径下的html文件内容设置到同一父结点的NotesGroup子结点下的NotesXhtmlData结点下
作者: 5i365 时间: 2022-3-15 21:27
本帖最后由 5i365 于 2022-3-15 21:29 编辑
回复 4# went
另外, 这个xml文件是某一文件中载取的一部分, 其它部分可能也有url的属性, 怎样加个限定条件, 更稳定一些呢? 好像前面的ap: 就是个限制条件, 感觉应该不会有情况
作者: 5i365 时间: 2022-3-16 07:49
本帖最后由 5i365 于 2022-3-16 07:57 编辑
回复 4# went
在国外论坛发贴, 有人给了一条回复, 这次应该所有条件都具备了, 就差编程了
感觉自己应该可以搞定了, 完全是胡搞一气, 直到有了想要的输出才明白了点门道
PS真是太强大了, 代码量比C#和PY什么的少的多,而且相对好理解一些
$ns = @{ ap = "http://www.w3.org" }
$a = Select-Xml "//ap:Hyperlink" ".\Document.xml" -Namespace $ns
$p = $a[0].node.ParentNode #第一个路径的父结点
$p.NotesGroup.NotesXhtmlData.html #html结点
作者: 5i365 时间: 2022-3-16 08:27
本帖最后由 5i365 于 2022-3-16 08:39 编辑
回复 4# went
两行代码搞定! 感觉只有PS能做到, PY如果不服可以来战
强烈建议初学批处理的朋友直接学PS,我对BAT基本上一看就晕, PY也觉得麻烦, 要装东西, 配置环境!
但是对PS简单些都能理解, 而且PS可以跨平台了, 学了之后, WIN, Mac os, linux 都有用武之地了!
- $a = Select-Xml "//ap:Hyperlink" ".\Document.xml" -Namespace @{ ap = "http://www.w3.org" }
- $a[0].node.ParentNode.NotesGroup.NotesXhtmlData.innerxml = (gc "$($a[0].node.url)\*.html" -enc UTF8)
复制代码
作者: 5i365 时间: 2022-3-16 08:43
利用管道一行代码搞定!- Select-Xml "//ap:Hyperlink" ".\Document.xml" -Namespace @{ ap = "http://www.w3.org" } | %{$_.node.ParentNode.NotesGroup.NotesXhtmlData.innerxml = gc "$($_.node.url)\*.html" -enc UTF8}
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |