XML中的常见问题(三)



 文档可以包含外国例如:

  foreigncharacters(úóí?)
  例如磲外国必须在前面加上escape序列外国可以是UTF-8编码或用区别编码指定如下所示:

  foreigncharacters(磲)
  现在可以正确加载XML了
  其他是保留在XML中并且需要以区别方式处理下面XML:

  This&that
  产生如下:
  此处不允许有空格
  行0000001:This&that
  位置0000012:----------^
  此处&是XML句法结构部分如果它仅仅放在XML数据源内部那么不能解释为&您需要替换称为“实体”特殊序列
  This&that
  下面需要相应实体:

  <<
  &&
  >>
  ""
  ’&apos;
  引号被用作标记中属性值定界符因此通常不能在属性值内部使用例如下面内容将返回:

  此处单引号既用作属性定界符又在属性值自身中为了纠正这个问题可以将属性定界符换成双引号:

  或者可以将单引号转义为实体&apos;

  上述两种方式都将通过XML对象模型中getAttribute思路方法返回属性值John’sStuff同样对于双引号您可以使用实体
  "
  也可以通过将文本放在CDATA节中来处理元素内容中特殊下面内容是正确:

  在本例子中XML对象模型将CDATA节点显示xml节点子节点它将返回
  This&thatisjust"text"content.
  作为nodeValue


  如何在VisualStudio6.0C中使用MSXMLCOM组件?
  在VisualC6.0中使用MSXMLCOM组件最简便方式是使用#import指令:
  #import"msxml.dll"named_guidsno_#import"msxml.dll"named_guidsno_
  它定义了所有IXML*接口和接口ID从而可以在应用中使用它们了也可以从INETSDK获取MSXML类型库和头文件(英文)以及包含类IIDsuuid.lib
  如何在XML中使用HTML实体?
  下面XML包含HTML实体:

  Copyright?2000,MicrosoftInc,Allrightsreserved.
  它产生下列:

  引用未定义实体’copy’
  行:1,位置:23,码:0xC00CE002
  Copyright?2000,...
  ----------------------^
  这是XML只有 5个内置实体有关内置实体详细信息请参阅如何加载有外国和特殊文档?
  要使用HTML实体需要用DTD定义它们有关DTD详细信息请参阅W3CXML建议(英文)要使用该DTD请将它直接包括在DOCTYPE标记中如下所示:

  Copyright?2000,MicrosoftInc,Allrightsreserved.

  要加载它需要关闭IXMLDOMDocument接口validateOnParse属性请尝试将它粘贴到“Validator测试页”中关闭DTD验证然后单击“验证”请注意文档将加载并且版权将显示在validator页面末尾DOM树中
  如果已经完成了DTD验证那么必须将作为参数实体HTML实体包括在现有DTD中如下所示:

  %HTMLENT;
  %HTMLENT;
  它将定义所有HTML实体以便在XML文档中使用它们
  在元素内容中如何处理空白
  XMLDOM有 3种访问元素文本内容方式:
  属性行为

  nodeValue按照原始XML源中指定那样返回TEXT、CDATA、COMMENT和PI节点上原始文本内容(包括空白)对于ELEMENT节点和DOCUMENT本身则返回空值

  数据和nodeValue相同

  文本重复连接指定子树中多个TEXT和CDATA节点并返回组合结果


  注意:空白包括新行、tab和空格
  nodeValue属性通常返回原始文档中内容和文档如何加载和当前xml:space范围无关
  文本属性连接指定子树中所有文本并扩展实体这和文档如何加载、preserveWhiteSpace开关当前状态和当前xml:space范围有关请看如下所示:
  preserveWhiteSpace=truewhenthedocumentisloaded
preserveWhiteSpace=truepreserveWhiteSpace=truepreserveWhiteSpace=falsepreserveWhiteSpace=falsexml:space=preservexml:space=defaultxml:space=preservexml:space=default保留保留保留保留并截断
  preserveWhiteSpace=falsewhenthedocumentisloaded
preserveWhiteSpace=truepreserveWhiteSpace=truepreserveWhiteSpace=falsepreserveWhiteSpace=falsexml:space=preservexml:space=defaultxml:space=preservexml:space=default半保留半保留并截断半保留半保留并截断


  此处保留表示和原始XML文档中完全相同原始文本内容截断意味着前导和尾部空格已经删除半保留意味着保留了“重要空白”并规范标准化了“不重要空白重要空白是文本内容内部空白不重要空白是标记的间空白请看如下所示:

  \\n
  \\tJane\\n
  \\tSmith\\n
  在本举例中红色是可以忽略不重要空白而绿色是重要空白它是文本内容部分因此有不可忽略重要含义所以在本例中文本属性返回下列结果:
  状态返回值
  保留"\\n\\tJane\\n\\tSmith\\n"
  
  保留并截断"Jane\\n\\tSmith"
  
  半保留"JaneSmith"
  
  半保留并截断"JaneSmith"
  请注意“半保留”将规范标准化不重要空白例如新行和tab将退化为单个空格如果更改xml:space属性和preserveWhiteSpace开关那么文本属性将返回相应区别值
  CDATAandxml:space="preserve"subtreeboundaries
  在下面例子中CDATA节点或“保留”节点内容将得到连接原因是它们不参和不重要空白规范标准化例如:

  \\n
  \\tJane\\n
  \\tSmith]>\\n
  在这种情况下CDATA节点内部空白不再和“不重要”空白“合并”并且不会截断因此“半保留并截断”情况将返回下列内容:
  "JaneSmith"


  在此和标记的间不重要空白将包括在内和CDATA节点内容无关如果用下列内容代替CDATA那么将返回相同结果:
  Smith
  实体是特殊
  实体是作为DTD部分加载和分析并且显示在DOCTYPE节点下它们不定要有任何xml:space范围例如:

  Jane\\n
  \\t\\n
  ">
  ]>
  &Jane;
  假定preserveWhiteSpace=false(在DOCTYPE标记范围内)在分析实体时不重要空白丢失实体将不会有空白节点树将类似于:

  DOCTYPEfoo
  ENTITY:Jane
  ELEMENT:employee
  ELEMENT:name
  TEXT:Jane
  ELEMENT:title
  TEXT>:SoftwareDesignEngineer
  ELEMENT:foo
  ATTRIBUTE:xml:space="preserve"
  ENTITYREF:Jane
  请注意在DOCTYPE内部ENTITY节点下显露DOM树不包含任何WHITESPACE节点这意味着ENTITYREF节点子节点也没有WHITESPACE节点即使实体引用在xml:space="preserve"范围内也是这样
  给定文档中引用每个ENTITY例子通常都有相同
  如果实体必须绝对保留空白那么它必须在自己内部指定自己xml:space属性或者文档preserveWhiteSpace开关必须设置为true
  如何处理属性中空白
  有几种方式可以访问属性值IXMLDOMAttribute接口有nodeValue属性它等价于作为Microsoft扩展nodeValue和text属性这些属性返回:属性返回文本

  attrNode.nodeValue
  attrNode.value
  getAttribute("name")返回和原始文档中完全相同内容(和扩展实体)
  attrNode.nodeTypedValueNull
  attrNode.text除了前导和尾部空白已经截断的外其他和nodeValue相同 “XML语言”规范标准为XML应用定义了下列行为:属性类型返回文本
  CDATAID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚举

  半规范标准化全规范标准化

  在此半规范标准化代表将新行和tab转换为空格但是多个空格不会退化为个空格
Tags: 

延伸阅读

最新评论

发表评论