我需要将字符串转换为XmlNode并将其添加到现有的Xaml文件中。
我的Xml字符串包含特殊字符。
这是我的Xml字符串(来自T4模板),其中包含“&#xE10F”作为属性值。
<Button Margin="10,0,0,0" Width="100" Height="100" HorizontalContentAlignment="Center"
Background="{StaticResource TopAppbarTileBackground}"
x:Name="chanceAppBarButton">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock ***Text=""*** VerticalAlignment="Top" HorizontalAlignment="Center"
TextAlignment="Center" Style="{StaticResource TopAppbarIconStyle}"/>
<TextBlock Grid.Row="1" Style="{StaticResource TopAppbarTileTextStyle}" x:Uid="chanceAppBarButtonLabel"
VerticalAlignment="Top" Margin="0" HorizontalAlignment="Center"
TextAlignment="Center"/>
</Grid></Button>
以下是将Xml String转换为Node并将其附加到现有文件的代码(部分)。
var xmldoc = new XmlDocument();
xmldoc.Load(filePath);
XmlElement rootElement = xmldoc.DocumentElement;
XmlNode xmlNode = CreateNodeFromXmlString(xmlNodeString, namespaceList);
XmlNode importNode = rootElement.OwnerDocument.ImportNode(xmlNode, true);
rootElement.AppendChild(importNode); // Add Xml node to Parent Element
xmldoc.Save(filePath); // Save Xml file
private static XmlNode CreateNodeFromXmlString(string xml, Dictionary<string, string> namespaceList)
{
var newDataTemplateDocument = new XmlDocument();
var nameTable = new NameTable();
var xmlNamespaceManager = new XmlNamespaceManager(nameTable);
foreach (var namespaceItem in namespaceList)
{
xmlNamespaceManager.AddNamespace(namespaceItem.Key, namespaceItem.Value);
}
var context = new XmlParserContext(nameTable, xmlNamespaceManager, null, XmlSpace.None);
var reader = new XmlTextReader(xml.Trim(), XmlNodeType.Element, context);
return newDataTemplateDocument.ReadNode(reader);
}
上面代码的输出是(只显示按钮控件):
<Button Margin="10,0,0,0" Width="100" Height="100" HorizontalContentAlignment="Center"
Background="{StaticResource TopAppbarTileBackground}"
x:Name="chanceAppBarButton">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text=" î„" VerticalAlignment="Top" HorizontalAlignment="Center"
TextAlignment="Center" Style="{StaticResource TopAppbarIconStyle}"/>
<TextBlock Grid.Row="1" Style="{StaticResource TopAppbarTileTextStyle}" x:Uid="chanceAppBarButtonLabel"
VerticalAlignment="Top" Margin="0" HorizontalAlignment="Center"
TextAlignment="Center"/>
</Grid></Button>
这里“&amp;#xE10F”被替换为“。
任何想法如何在读/写XML时停止转义特殊字符?
答案 0 :(得分:6)
默认情况下,XML以UTF8编码写出。在UTF8中,ASCII范围之上的字符表示为2到3个字节的序列。我没有检查过,但我认为XML序列化程序完全正确,如果你解析XML,你将得到你的0xE10F字符。从XML的角度来看,这是一个没有区别的差异。
如果您真的想要使用数字字符实体,请告诉序列化程序使用ASCII作为其编码。 ASCII不能直接表示0xE10F字符,序列化器将实现这一点,并使用字符实体来解决问题。
答案 1 :(得分:2)
您可以使用base64编码或使用CDATA标记以XML格式存储复杂数据。
有关CDATA示例,请参阅http://www.w3schools.com/xml/xml_cdata.asp