读/写包含特殊字符的XML节点

时间:2014-01-30 21:48:15

标签: xml xml-parsing

我需要将字符串转换为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="&#xE10F;"*** 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时停止转义特殊字符?

2 个答案:

答案 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