如何使用 C# XmlReader 忽略未知名称空间?

Mar*_*han 5 c# xml xmlreader uwp

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

预期输出 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>
Run Code Online (Sandbox Code Playgroud)

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

using (StringReader sr = new StringReader(xml))
{
    using (XmlReader xtr = XmlReader.Create(sr))
    {
        return XDocument.Load(xtr);
    }
}
Run Code Online (Sandbox Code Playgroud)

Loc*_*eer -1

不是忽视他们,而是只要有人在场就简单地接受。

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);
Run Code Online (Sandbox Code Playgroud)

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

var nodeList = xml.SelectNodes("//ns:whatever", ns);
Run Code Online (Sandbox Code Playgroud)

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