我正在尝试使用 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/