【发布时间】:2013-12-30 15:32:59
【问题描述】:
TL/DR:使用LINQ to XML 更改命名空间值的最简单方法是什么,例如从xmlns:gcs="clr-namespace:NsOne;assembly=AsmOne" 到xmlns:gcs="clr-namespace:NsTwo;assembly=AsmTwo"?
为什么?因为:
我使用System.Windows.Markup.XamlWriter.Save(myControl) 序列化了Xaml。我想在另一个项目中将这个 GUI 外观可视化(使用 System.Windows.Markup.XamlReader.Parse(raw) 反序列化)。
我不想链接到原始程序集!
我只需要更改命名空间,所以XamlReader.Parse(raw) 不会抛出异常。我目前使用正则表达式它可以工作,但我不喜欢这种方法(例如,如果我在CDATA 中有xmlns:gcs="clr-namespace:NsOne;assembly=AsmOne")
这是我的序列化Xaml:
<FlowDocument PagePadding="5,0,5,0" AllowDrop="True"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:gcs="clr-namespace:NsOne;assembly=AsmOne"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<gcs:MyParagraph Margin="0,0,0,0">
<gcs:MyParagraph.MetaData>
<gcs:ParagraphMetaData UpdaterParagraphUniqueId="1" />
</gcs:MyParagraph.MetaData>
<Span>some text...</Span>
</gcs:MyParagraph>
<gcs:MyParagraph Margin="0,0,0,0" Background="#FFF0F0F0">
<gcs:MyParagraph.MetaData>
<gcs:ParagraphMetaData UpdaterParagraphUniqueId="2" />
</gcs:MyParagraph.MetaData>
<Span Foreground="#FF0000FF">some more text...</Span>
</gcs:MyParagraph>
</FlowDocument>
(MyParagraph 和ParagraphMetaData 是自定义类型,它们都存在于源程序集和目标程序集中。MyParagraph 继承了WPF 的Paragraph)
【问题讨论】:
标签: c# xml xaml serialization xml-namespaces