无法从XML文件读取密钥

问题描述 投票:0回答:1

我正在尝试通过解析相关的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']"

肯定有更好的方法吗?

c# xml asp.net-core .net-core linq-to-xml
1个回答
0
投票

检查此代码。

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");
© www.soinside.com 2019 - 2024. All rights reserved.