我正在尝试通过解析相关的XML文件来获取Windows计划任务的“ Command”元素
即,
var taskFile = $"{Environment.SystemDirectory}\\Tasks\\MyBackupTask";
该文件如下所示:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
...
<Actions Context="Author">
<Exec>
<Command>C:\somepath\MyBackupTask.exe</Command>
</Exec>
</Actions>
</Task>
我现在试图简单地加载和解析文件并获取Command值,我无法解决这个问题,也许是名称空间问题(在这种情况下可以放心忽略)?(请注意,我不希望将名称空间硬编码到我的路径查询中,因为在Windows版本之间可能会发生变化,我只希望它被忽略)
var xdoc = XDocument.Load(taskFile);
var el=xdoc.Root.XPathSelectElement("./Actions/Exec/Command"); // returns null
var el=xdoc.Root.XPathSelectElement("/Actions/Exec/Command"); // returns null
var el=xdoc.Root.XPathSelectElement("*[local-name()='Task']/Actions/Exec/Command"); // returns null
var el=xdoc.Root.XPathSelectElement("/*[local-name()='Actions']/Exec/Command"); // returns null
var el=xdoc.Root.XPathSelectElement("*:Task/Actions/Exec/Command"); // throws exception
var el=xdoc.Root.XPathSelectElement("/*:Actions/Exec/Command"); // throws exception
如何完成?
((使用.NET Core 3.1)
编辑:
此作品:
static string ValueAtPath(XElement root, string path) {
path = String.Concat(path.Split('/').Select(x => $"/child::node()[local-name()='{x}']"));
return root.XPathSelectElement(path)?.Value;
}
var command = ValueAtPath(xdoc.Root, "Task/Actions/Exec/Command");
通过将"Task/Actions/Exec/Command"
变成"/child::node()[local-name()='Task']/child::node()[local-name()='Actions']/child::node()[local-name()='Exec']/child::node()[local-name()='Command']"
肯定有更好的方法吗?
检查此代码。
var xdoc = XDocument.Load(taskFile).Document.ToString();
xdoc = xdoc.Replace("version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\"", "");
XmlDocument xd = new XmlDocument();
xd.LoadXml(xdoc);
var el1 = xd.SelectSingleNode("Task/Actions/Exec/Command");