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,但也应该让您继续。