簡體   English   中英

如何阻止 XDocument 解析我的角色實體

[英]How can I stop XDocument from resolving my character entities

我正在閱讀 XML 並以各種方式處理數據。 但是,許多 XML 文檔包含 ISO 字符實體。 我需要保留這些作為它們的實體代碼,但是當 XDocument 讀取 XML 文件時,它會立即將實體解析為它們各自的符號。

我怎樣才能防止這種情況發生?

這是 XML 的一個非常小的樣本,表中列出了 5 個實體。 我需要讀取文件但保留實體代碼:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
<table>
    <title>iso-amsa.ent</title>
    <tgroup cols="3">
        <colspec colname="col1" colwidth="0.50*"/>
        <colspec colname="col2" align="center" colwidth="0.40*"/>
        <colspec colname="col3" colwidth="2.20*"/>
        <thead>
            <row><entry><para>ISO Entity Name</para></entry><entry><para>Unicode Entity</para></entry><entry><para>Description</para></entry></row>
        </thead>
        <tbody>
            <row><entry><para>cularr</para></entry><entry><para>&#x21B6;</para></entry><entry><para>ANTICLOCKWISE TOP SEMICIRCLE ARROW</para></entry></row>
            <row><entry><para>curarr</para></entry><entry><para>&#x21B7;</para></entry><entry><para>CLOCKWISE TOP SEMICIRCLE ARROW</para></entry></row>
            <row><entry><para>dArr</para></entry><entry><para>&#x21D3;</para></entry><entry><para>DOWNWARDS DOUBLE ARROW</para></entry></row>
            <row><entry><para>darr2</para></entry><entry><para>&#x21CA;</para></entry><entry><para>DOWNWARDS PAIRED ARROWS</para></entry></row>
            <row><entry><para>dharl</para></entry><entry><para>&#x21C3;</para></entry><entry><para>DOWNWARDS HARPOON WITH BARB LEFTWARDS</para></entry></row>
        </tbody>
    </tgroup>
</table>
</doc>

這是我讀取文件的非常簡單的方法(但我嘗試了各種方法):

string fileName = "C:\MyTestFile.xml";

XDocument _doc = XDocument.Load(fileName);

一旦讀取 XML,它就會將實體轉換為它們的符號。

我怎樣才能防止這種情況發生?

加載 XML 后, XDocument不會保留文本編碼。 編碼是base stream的一部分,沒有加載XML。

如果要在將 XML 另存為字符串時對這些實體進行重新編碼,則需要使用帶有EncodingXmlWriter

例如,使用MemoryStream

var ms = new MemoryStream();
using (var writer = XmlWriter.Create(ms, new XmlWriterSettings {Encoding = Encoding.ASCII}))
{
    _doc.Save(writer);
}
Console.WriteLine(Encoding.ASCII.GetString(ms.GetBuffer(), 0, ms.Length));

或者使用FileStream

using (var fs = new FileStream(@"somePathHere", FileMode.OpenOrCreate, FileAccess.Write))
using (var writer = XmlWriter.Create(fs, new XmlWriterSettings {Encoding = Encoding.ASCII}))
{
    _doc.Save(writer);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM