选择 xpath 和 xdocument 的 xml 文件部分 - C#/Win8

本文关键字:Win8 文件部 xml xpath xdocument 选择 | 更新日期: 2023-09-27 18:35:00

我正在构建一个Windows 8应用程序,我需要从大型xml文档中提取整个XML节点及其子节点作为字符串,到目前为止执行此操作的方法如下所示:

    public string GetNodeContent(string path)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.ConformanceLevel = ConformanceLevel.Auto;
        settings.IgnoreComments = true;
        using (XmlReader reader = XmlReader.Create("something.xml", settings))
        {
            reader.MoveToContent();
            reader.Read();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(reader.ReadOuterXml());
            IXmlNode node = doc.SelectSingleNode(path);
            return node.InnerText;
        }
    }

当我传递任何形式的 xpath 时,节点会得到 null 的值。我正在使用读取器获取根节点的第一个子节点,然后使用 XMLDocument 从该 xml 创建一个子节点。显然,由于它是Windows 8,我不能使用XPathSelectElements方法,这是我无法想到的唯一方法。有没有办法使用这个或任何其他逻辑来做到这一点?

提前感谢您的回答。

[更新]

假设 XML 具有以下一般形式:

<nodeone attributes...>
    <nodetwo attributes...>
        <nodethree attributes... />
        <nodethree attributes... />
        <nodethree attributes... />
    </nodetwo>
</nodeone >
我希望在传递"/nodeone/nodetwo">

或"//nodetwo"时以xml字符串的形式获得nodetwo及其所有子项

选择 xpath 和 xdocument 的 xml 文件部分 - C#/Win8

我想

出了这个解决方案,整个方法一开始都是错误的。有问题的部分是这个代码

reader.MoveToContent();
reader.Read();

忽略命名空间本身,因为它会跳过根标记。这是新的工作代码:

public static async Task<string> ReadFileTest(string xpath)
{
    StorageFolder folder = await Package.Current.InstalledLocation.GetFolderAsync("NameOfFolderWithXML");
    StorageFile xmlFile = await folder.GetFileAsync("filename.xml");
    XmlDocument xmldoc = await XmlDocument.LoadFromFileAsync(xmlFile);
    var nodes = doc.SelectNodes(xpath);
    XmlElement element = (XmlElement)nodes[0];
    return element.GetXml();
}