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

时间:2017-03-31 12:05:30

标签: 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);
    }
}

1 个答案:

答案 0 :(得分:-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);

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

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

编辑:这是使用XmlDocument,而不是XDocument,但也应该让你去。