c# - 如何使用 C# XmlReader 忽略未知的命名空间?

标签 c# xml uwp xmlreader

我正在尝试使用 XmlReader 从输入中读取字符串 XML 片段,操作 XDocument 并将结果作为字符串输出。
如果存在对未知 XML 命名空间的引用,我只想保留此引用,而不以任何方式修改它。
请注意,我不知道可能的命名空间列表,因此无法手动创建命名空间白名单。
我的目标是 UWP 平台,所以这里不能使用 XmlTextReader。

输入 XML 文档的示例:

<VisualState x:Name="Disabled">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>

预期输出 XML 文档的示例:

<VisualState x:Name="Disabled">
  <VisualState.Setters>
    <Setter Target="RootGrid.Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" />
    <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" />
    <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource SystemControlDisabledTransparentBrush}" />
  </VisualState.Setters>    
</VisualState>

我当前用于解析 XML 的代码:

using (StringReader sr = new StringReader(xml))
{
    using (XmlReader xtr = XmlReader.Create(sr))
    {
        return XDocument.Load(xtr);
    }
}

最佳答案

不是无视他们,而是只要有人在场就接受。

xml.Load(fil);
var ns = new XmlNamespaceManager(xml.NameTable);
var nsNode = xml.DocumentElement.Attributes.GetNamedItem("xmlns");
var nsurl = (nsNode != null) ? nsNode.Value : "";

ns.AddNamespace("ns", nsurl);

如果您现在为所有 XPath(如果有的话)加上“ns:”前缀并将命名空间管理器作为参数传递,您应该没问题:

var nodeList = xml.SelectNodes("//ns:whatever", ns);

编辑:这是使用 XmlDocument,而不是 XDocument,但也应该让您继续。

关于c# - 如何使用 C# XmlReader 忽略未知的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140263/

相关文章:

c# - 尝试启动监听器套接字

c# - System.Timers.Timer 几毫秒后第二次触发

c# - 关闭通过事务获取的 AutoCAD 对象

c# - 将嵌套 XML 中的父对象获取到 Linq

xml - xslt 在 2 个值之间选择

android - 停止 xml 实体生成正方形

xml - 公共(public) SOAP WSDL 文件是否存在安全问题?

uwp - 如何在 UWP 中从本地磁盘中删除文件

uwp - 如何使用 Desktop App Converter 将 UWP 应用程序打包为 Win32 后台进程

c# - UWP 如何隐藏应用程序?