/
XmlDocumentType.cs
138 lines (118 loc) · 4.02 KB
/
XmlDocumentType.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
using System.Xml.Schema;
namespace System.Xml
{
// Contains information associated with the document type declaration.
public class XmlDocumentType : XmlLinkedNode
{
private readonly string _name;
private readonly string? _publicId;
private readonly string? _systemId;
private readonly string? _internalSubset;
private bool _namespaces;
private XmlNamedNodeMap? _entities;
private XmlNamedNodeMap? _notations;
// parsed DTD
private SchemaInfo? _schemaInfo;
protected internal XmlDocumentType(string name, string? publicId, string? systemId, string? internalSubset, XmlDocument doc) : base(doc)
{
_name = name;
_publicId = publicId;
_systemId = systemId;
_namespaces = true;
_internalSubset = internalSubset;
Debug.Assert(doc != null);
if (!doc.IsLoading)
{
doc.IsLoading = true;
XmlLoader loader = new XmlLoader();
loader.ParseDocumentType(this); // will edit notation nodes, etc.
doc.IsLoading = false;
}
}
// Gets the name of the node.
public override string Name
{
get { return _name; }
}
// Gets the name of the current node without the namespace prefix.
public override string LocalName
{
get { return _name; }
}
// Gets the type of the current node.
public override XmlNodeType NodeType
{
get { return XmlNodeType.DocumentType; }
}
// Creates a duplicate of this node.
public override XmlNode CloneNode(bool deep)
{
Debug.Assert(OwnerDocument != null);
return OwnerDocument.CreateDocumentType(_name, _publicId, _systemId, _internalSubset);
}
//
// Microsoft extensions
//
// Gets a value indicating whether the node is read-only.
public override bool IsReadOnly
{
get
{
return true; // Make entities and notations readonly
}
}
// Gets the collection of XmlEntity nodes declared in the document type declaration.
public XmlNamedNodeMap Entities => _entities ??= new XmlNamedNodeMap(this);
// Gets the collection of XmlNotation nodes present in the document type declaration.
public XmlNamedNodeMap Notations => _notations ??= new XmlNamedNodeMap(this);
//
// DOM Level 2
//
// Gets the value of the public identifier on the DOCTYPE declaration.
public string? PublicId
{
get { return _publicId; }
}
// Gets the value of
// the system identifier on the DOCTYPE declaration.
public string? SystemId
{
get { return _systemId; }
}
// Gets the entire value of the DTD internal subset
// on the DOCTYPE declaration.
public string? InternalSubset
{
get { return _internalSubset; }
}
internal bool ParseWithNamespaces
{
get { return _namespaces; }
set { _namespaces = value; }
}
// Saves the node to the specified XmlWriter.
public override void WriteTo(XmlWriter w)
{
w.WriteDocType(_name, _publicId, _systemId, _internalSubset);
}
// Saves all the children of the node to the specified XmlWriter.
public override void WriteContentTo(XmlWriter w)
{
// Intentionally do nothing
}
internal SchemaInfo? DtdSchemaInfo
{
get
{
return _schemaInfo;
}
set
{
_schemaInfo = value;
}
}
}
}