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

Pra*_*hta 3 xml xml-parsing

我需要将字符串转换为XmlNode并将其添加到现有的Xaml文件中.

我的Xml字符串包含特殊字符.

这是我的Xml字符串(来自T4模板),其中包含""作为属性值.

<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>
Run Code Online (Sandbox Code Playgroud)

下面是将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);
    }
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是(只显示按钮控件):

<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>
Run Code Online (Sandbox Code Playgroud)

这里""被替换为"î"".

知道如何在读/写XML时停止转义特殊字符?

kes*_*lam 6

默认情况下,XML以UTF8编码写出.在UTF8中,ASCII范围之上的字符表示为2到3个字节的序列.我没有检查过,但我认为XML序列化程序完全正确,如果你解析XML,你将得到你的0xE10F字符.从XML的角度来看,这是一个没有区别的差异.

如果您真的想要使用数字字符实体,请告诉序列化程序使用ASCII作为其编码.ASCII不能直接表示0xE10F字符,序列化器将实现这一点并使用字符实体来解决问题.