我正在尝试使用 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);
}
}
答案 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,但也应该让你去。