屬性值常為字串,但實際可能包含 Date、Boolean 等類型。需轉換為原生類型使用。
屬性值含純文字與實體時,唯有 XmlValidatingReader 能處理實體。XmlTextReader 僅能提取文字部分。
while (reader.ReadAttributeValue())
{
if (reader.NodeType == XmlNodeType.EntityReference)
buf += YourResolverCode(reader.Name); // 自訂實體解析
else
buf += reader.Value; // 純文字直接追加
}
返回 false 結束循環,buffer 即完整屬性值。
非 XML 標準字符會導致轉換錯誤。只有 W3C XML 規範定義的有效字符可用於元素/屬性名。
// 空格編碼為 _x0020_
XmlConvert.EncodeName("Invoice Details"); // "Invoice_x0020_Details"
// 解碼還原(需完整十六進制碼)
XmlConvert.DecodeName("Invoice_x0020_Details"); // "Invoice Details"
XML 中空白包含空格、換行、縮進。XmlTextReader.WhiteSpaceHandling 屬性控制:
| 枚舉值 | 行為 |
|---|---|
| All(預設) | 有意義/無意義空白皆作為節點返回 |
| None | 忽略所有空白 |
| Significant | 僅返回 SignificantWhitespace 節點 |
xml:space="preserve" 可強制保留元素內空白。WhiteSpaceHandling 可隨時修改影響後續 Read,屬少數可動態調整的閱讀器屬性。
.NET 無 LoadXML 直接從字串創建閱讀器,但可用 StringReader 橋接:
string xmlText = "...";
StringReader strReader = new StringReader(xmlText);
XmlTextReader reader = new XmlTextReader(strReader);
同理 StringWriter 可用於記憶體中創建 XML。
無根節點的 XML 文字為片段,非格式良好文檔。.NET 支援結合 XmlParserContext 解析片段:
public XmlTextReader(
string xmlFragment,
XmlNodeType fragType, // Element/Attribute/Document
XmlParserContext context // encoding、DTD、命名空間、語言、空白處理
);
範例片段:<author>Dino</author><author>Esposito</author>(無根節點)