更改Xml声明或选择不带声明部分的xml。

5

我需要更改文档的xml声明部分,或者只选择数据减去声明。哪个更容易?

以下是我的xml示例:

<?xml version="1.0" encoding="utf-16"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master page-height="11in" page-width="8.5in" margin-top="0.50in" margin-left="0.8in" margin-right="0.8in" margin-bottom="0.25in" master-name="PageMaster">
            <fo:region-body border-style="none" border-width="thin" margin-top="0in" margin-left="0in" margin-right="0in" margin-bottom="0.25in"/>
            <fo:region-after border-style="none" border-width="thin" extent="0.25in"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="PageMaster"/>
</fo:root>

我试图更改XML声明为:

<?xml version="1.0" encoding="iso-8859-1"?>

你为什么要尝试更改XML声明? - Tomalak
@RobLevine 它被传递为一个xml字符串,然后从中创建一个xml文档。我尝试使用xml.SelectSingleNode,但它告诉我“需要命名空间管理器或XsltContext。此查询具有前缀、变量或用户定义的函数。” - ganders
2
更改XML声明不会神奇地改变文档的编码。明确一点:你试图做的事情是没有帮助的。修复创建XML文档的过程,而不是在其结果中进行黑客攻击。另外:64位服务器与否与问题完全没有任何关系。你缺乏有关字符编码的基本知识,应该在开始应用任何半吊子修复之前阅读相关主题。 - Tomalak
@Tomalak 这只需要在其中指定某种声明,就像这样容易吗?因为这些 xslfo“二进制大块”被保存在数据库中时没有xml声明行,它只是以 <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 开始。 - ganders
如果文档是通过XSL模板生成的,那么你根本不应该遇到任何编码问题。对于不间断空格,你应该分别看到UTF-16的字节序列00 A0,UTF-8的字节序列C2 A0以及ANSI编码的字节序列A0。同样地,检查ASCII范围之外的其他字符以进行一致性检查。要找出BLOB的字符编码,检查你的数据库。这些BLOB如何集成到结果文档中? - Tomalak
显示剩余6条评论
2个回答

9

您是否试图以编程方式更改XML?如果是这样,您可以通过创建新的XmlDeclaration并将其替换为先前的声明来实现,如下所示:

XmlDeclaration xmlDeclaration;
xmlDeclaration = doc.CreateXmlDeclaration("1.0", "iso-8859-1", null);
doc.ReplaceChild(xmlDeclaration, doc.FirstChild);

你只需要确保文档的第一个子元素是XML声明。

1

想要进行“XML声明更改”的操作非常容易(不评论这种更改是否是解决您问题的正确方法),只需使用XSLT即可:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes" encoding="ISO-8859-1"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

只需将此转换应用于提供的 XML 文档

<?xml version="1.0" encoding="utf-16"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master page-height="11in" page-width="8.5in" margin-top="0.50in" margin-left="0.8in" margin-right="0.8in" margin-bottom="0.25in" master-name="PageMaster">
            <fo:region-body border-style="none" border-width="thin" margin-top="0in" margin-left="0in" margin-right="0in" margin-bottom="0.25in"/>
            <fo:region-after border-style="none" border-width="thin" extent="0.25in"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="PageMaster"/>
</fo:root>

并且期望的结果被产生

<?xml version="1.0" encoding="iso-8859-1"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master page-height="11in" page-width="8.5in" margin-top="0.50in" margin-left="0.8in" margin-right="0.8in" margin-bottom="0.25in" master-name="PageMaster">
            <fo:region-body border-style="none" border-width="thin" margin-top="0in" margin-left="0in" margin-right="0in" margin-bottom="0.25in" />
            <fo:region-after border-style="none" border-width="thin" extent="0.25in" />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="PageMaster" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接