예제 #1
0
        private void StartNewSplit(ElementInfos elementQueue, IEnumerable <ElementInfo> tempQueue)
        {
            _currentWriter = _outputManager.GetXmlWriter();

            _currentSplitInfo.FileName = _outputManager.CurrentFileName;
            _currentSplitInfo.FullPath = _outputManager.CurrentFileFullPath;

            _currentWriter.WriteStartDocument();
            _currentWriter.WriteStartElement(VwNamespacePrefix, FragmentElementlName, ItJakubTeiNamespace);
            _currentWriter.WriteAttributeString(XmlnsAttributeName, TeiNamespace);
            _currentWriter.WriteAttributeString(NAttributeName, _sourceDocumentInfo.XmlId);
            _currentWriter.WriteAttributeString(ChangeAttributeName, _sourceDocumentInfo.VersionId);
            if (tempQueue == null)
            {
                return;
            }
            foreach (ElementInfo elementInfo in tempQueue)
            {
                ElementInfo newElementInfo = elementInfo.Clone();

                newElementInfo.Attributes.Add(new AttributeInfo(VwNamespacePrefix, ContinueAttributeName, ItJakubTeiNamespace, TrueValue));
                WriteElementInfo(newElementInfo, _currentWriter);
                elementQueue.Push(elementInfo);
            }
        }
예제 #2
0
        public void SplitOnStartingElement()
        {
            bool splittingStarted = (StartingElement == null);

            ElementInfos elementStack = new ElementInfos();
            FileInfo     xmlFileInfo  = new FileInfo(XmlFile);


            string newFileFormat = xmlFileInfo.Name.Substring(0, xmlFileInfo.Name.Length - xmlFileInfo.Extension.Length) + NumberedXmlPattern;


            _outputManager = new OutputManager();
            _outputManager.OutputDirectory = OutputDirectory;
            _outputManager.FileNameFormat  = newFileFormat;



            using (XmlReader reader = XmlReader.Create(XmlFile))
            {
                reader.MoveToContent();
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        bool isEmpty = reader.IsEmptyElement;

                        if (!splittingStarted)
                        {
                            if (reader.Name == StartingElement)
                            {
                                splittingStarted = true;
                                _currentWriter   = _outputManager.GetXmlWriter();
                                _currentWriter.WriteStartDocument();
                                _currentWriter.WriteStartElement(FragmentElementlName, TeiNamespace);
                            }
                        }

                        if (!splittingStarted)
                        {
                            continue;
                        }

                        ElementInfo element = ElementInfo.GetElementInfo(reader); //GetElementInfo(reader);
                        elementStack.Push(element);
                        WriteElementInfo(element, _currentWriter);

                        if (!isEmpty)
                        {
                            continue;
                        }
                        elementStack.Pop();
                    }

                    else if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        if (!splittingStarted)
                        {
                            continue;
                        }
                        string      name        = reader.Name;
                        ElementInfo elementPeak = elementStack.Peek();
                        if (elementPeak.Name != name)
                        {
                            Console.WriteLine("Chyba element × reader ({0} × {1})", elementPeak.Name, name);
                        }
                        else
                        {
                            Transformace.SerializeNode(reader, _currentWriter);
                            elementStack.Pop();
                        }
                        if (name == StartingElement)
                        {
                            elementStack.CloneReverse();

                            while (elementStack.Count > 0)
                            {
                                _currentWriter.WriteEndElement();
                                elementStack.Pop();
                            }
                            _currentWriter.WriteFullEndElement();
                            _currentWriter.Close();

                            splittingStarted = false;
                            //currentWriter = outputManager.GetXmlWriter();
                        }
                    }
                    else
                    {
                        if (splittingStarted)
                        {
                            Transformace.SerializeNode(reader, _currentWriter);
                        }
                    }
                }
            }
        }