[英]How to include CDATA when writing Saxon's XdmNode to Stream in C#
我有一個通過轉換生成的XdmNode對象,我需要將其寫入包含某些CDATA的流中,但是我無法獲得包含CDATA轉義的輸出。
這是因為我沒有進行序列化的過程,例如,使用Serializer類嗎? 如果是這樣,我該怎么做? 我可以看到Serializer類在Java中有一個serializeNode()方法,但在C#中卻沒有。。。只有transform / etc似乎能夠“使用”它。 還是cdata-section-elements語句周圍的問題?
從此處使用XML和XSLT進行說明: 如何強制xslt轉換將數據加載到cdata節中?
這使用.NET 4.5和C#中的Saxon 9.6.0.6。
C#代碼:
Processor processor = new Processor();
XdmNode node = GetNode(processor); //gets XdmNode for XML doc below
XsltTransformer transformer = GetTransformer(processor); //gets transform below
transformer.InitialContextNode = node;
XdmDestination output = new XdmDestination();
transformer.Run(output);
string results = output.XdmNode.OuterXml;
using (XmlWriter writer = XmlWriter.Create(Console.Out))
{
output.XdmNode.WriteTo(writer);
}
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"
cdata-section-elements="num"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
預期產量:
<nums>
<num><![CDATA[01]]></num>
<num><![CDATA[02]]></num>
<num><![CDATA[03]]></num>
<num><![CDATA[04]]></num>
<num><![CDATA[05]]></num>
<num><![CDATA[06]]></num>
<num><![CDATA[07]]></num>
<num><![CDATA[08]]></num>
<num><![CDATA[09]]></num>
<num><![CDATA[10]]></num>
</nums>
實際輸出(在控制台上和在字符串中):
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
似乎您想要做的是將XdmNode發送到序列化器,以使其使用序列化器上設置的屬性進行序列化。 最簡單的方法可能是運行一個虛擬查詢:
QueryCompiler qc = Processor.NewQueryCompiler();
QueryEvaluator qe = qc.Compile(".").Load();
qe.ContextItem = xdmNode;
qe.Run(serializer);
XQuery表達式“。” 只需返回上下文項。
順便說一句,Serializer的API文檔沒有說明CDATA_SECTION_ELEMENTS屬性應采用什么形式,但我認為它可能是用Clark表示法的QNames的空格分隔的序列,即Q{uri}local
。 如果沒有名稱空間,則只是本地名稱。
(這類似於Java JAXP界面中經常運行“身份轉換”的方法。但是身份查詢要簡單得多。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.