@@ -183,7 +183,110 @@ public void WriteText(string text)
183183 [ ContextMethod ( "ЗаписатьТекущий" , "WriteCurrent" ) ]
184184 public void WriteCurrent ( XmlReaderImpl reader )
185185 {
186- _writer . WriteNode ( reader . GetNativeReader ( ) , false ) ;
186+ var nodeType = reader . NodeType . UnderlyingValue ;
187+ switch ( nodeType )
188+ {
189+ case XmlNodeType . Element :
190+ CopyElementAndAttributes ( reader , this ) ;
191+ break ;
192+ case XmlNodeType . XmlDeclaration :
193+ WriteXMLDeclaration ( ) ;
194+ break ;
195+ case XmlNodeType . DocumentType :
196+ CopyDocumentType ( reader , this ) ;
197+ break ;
198+ case XmlNodeType . Attribute :
199+ CopyAttribute ( reader . Name , reader . Value , reader , this ) ;
200+ break ;
201+ case XmlNodeType . EndElement :
202+ WriteEndElement ( ) ;
203+ break ;
204+ case XmlNodeType . CDATA :
205+ WriteCDATASection ( reader . Value ) ;
206+ break ;
207+ case XmlNodeType . Text :
208+ WriteText ( reader . Value ) ;
209+ break ;
210+ case XmlNodeType . Whitespace :
211+ case XmlNodeType . SignificantWhitespace :
212+ WriteText ( reader . Value ) ;
213+ break ;
214+ case XmlNodeType . Comment :
215+ WriteComment ( reader . Value ) ;
216+ break ;
217+ case XmlNodeType . EntityReference :
218+ WriteEntityReference ( reader . Name ) ;
219+ break ;
220+ case XmlNodeType . ProcessingInstruction :
221+ WriteProcessingInstruction ( reader . Name , reader . Value ) ;
222+ break ;
223+ case XmlNodeType . Entity :
224+ case XmlNodeType . EndEntity :
225+ case XmlNodeType . Document :
226+ case XmlNodeType . DocumentFragment :
227+ case XmlNodeType . Notation :
228+ throw new RuntimeException ( new Localization . BilingualString ( $ "Копирование узла { nodeType } не поддерживается") ) ;
229+ default :
230+ break ;
231+ }
232+ }
233+
234+ private static void CopyDocumentType ( XmlReaderImpl reader , XmlWriterImpl writer )
235+ {
236+ writer . WriteDocumentType ( reader . Name , reader . Value ) ;
237+ }
238+
239+ private static void CopyElementAndAttributes ( XmlReaderImpl reader , XmlWriterImpl writer )
240+ {
241+ writer . WriteStartElement ( reader . Name ) ;
242+ var attributeCount = reader . AttributeCount ( ) ;
243+ if ( attributeCount != 0 )
244+ {
245+ for ( var attributeIndex = 0 ; attributeIndex < attributeCount ; attributeIndex ++ )
246+ {
247+ var attributeName = reader . AttributeName ( attributeIndex ) ;
248+ var attributeValue = reader . GetAttribute ( ValueFactory . Create ( attributeIndex ) ) . ExplicitString ( ) ;
249+ CopyAttribute ( attributeName , attributeValue , reader , writer ) ;
250+ }
251+ }
252+ }
253+
254+ private static void CopyAttribute ( string attributeNameIn , string attributeValue , XmlReaderImpl reader , XmlWriterImpl writer )
255+ {
256+ var splittedName = splitName ( attributeNameIn ) ;
257+ if ( ! string . IsNullOrEmpty ( splittedName . prefix ) )
258+ {
259+ var readerNsContext = ( XmlNamespaceContext ) reader . NamespaceContext ;
260+ var writerNsContext = ( XmlNamespaceContext ) writer . NamespaceContext ;
261+ if ( splittedName . prefix . Equals ( "xmlns" , StringComparison . Ordinal ) )
262+ {
263+ writer . WriteNamespaceMapping ( splittedName . localName , attributeValue ) ;
264+ return ;
265+ }
266+ else
267+ {
268+ var uri = readerNsContext . LookupNamespaceUri ( splittedName . prefix ) ;
269+ if ( uri is BslStringValue )
270+ {
271+ var value = uri . ExplicitString ( ) ;
272+ var currentPrefix = writerNsContext . LookupPrefix ( value ) ;
273+ if ( ! ( currentPrefix is BslStringValue && currentPrefix . ExplicitString ( ) . Equals ( splittedName . prefix , StringComparison . Ordinal ) ) )
274+ {
275+ writer . WriteNamespaceMapping ( splittedName . prefix , value ) ;
276+ }
277+ splittedName . prefix = value ;
278+ }
279+ }
280+ }
281+ writer . WriteAttribute ( splittedName . localName , splittedName . prefix , attributeValue ) ;
282+ }
283+
284+ private static ( string prefix , string localName ) splitName ( string nameOrLocalName )
285+ {
286+ var parts = nameOrLocalName . Split ( ':' ) ;
287+ if ( parts . Length > 1 ) return ( parts [ 0 ] , parts [ 1 ] ) ;
288+ if ( parts [ 0 ] . Equals ( "xmlns" , StringComparison . Ordinal ) ) return ( parts [ 0 ] , "" ) ;
289+ return ( "" , parts [ 0 ] ) ;
187290 }
188291
189292 [ ContextMethod ( "ЗаписатьТипДокумента" , "WriteDocumentType" ) ]
0 commit comments