示例#1
0
        public void Parse()
        {
            System.IO.StreamReader sr       = new System.IO.StreamReader(GetFullPath());
            XmlReaderSettings      settings = new XmlReaderSettings();

            settings.DtdProcessing = DtdProcessing.Parse;
            XmlReader reader = XmlReader.Create(sr, settings);

            try {
                node = new NodeEntity();
                node.SetNodeName(fileName);
                node.SetNodeID(0);
                node.SetDepth(0);
                node.Comment(false);
                while (reader.Read())
                {
                    ParseElement(reader);
                    ParseText(reader);
                    ParseCDATA(reader);
                    ParseEndElement(reader);
                    ParseComment(reader);
                }
            } catch (Exception) {
                throw;
            } finally {
                if (reader != null)
                {
                    reader.Close();
                }
                if (sr != null)
                {
                    sr.Close();
                }
            }
        }
示例#2
0
        private void ParseElement(XmlReader reader)
        {
            if (reader.NodeType != XmlNodeType.Element)
            {
                return;
            }

            string     nodeName = reader.Name;
            NodeEntity newNode  = new NodeEntity();

            newNode.SetNodeName(nodeName);
            newNode.SetNodeID(currentNodeId);
            currentNodeId++;
            ParseAttributes(reader, newNode);
            if (currentNodeId == 1)
            {
                node = newNode;
            }
            else
            {
                node.FindTail(depth).AddChild(newNode);
            }
            if (!reader.IsEmptyElement)
            {
                depth++;
            }
        }
示例#3
0
        public void AddComment()
        {
            NodeEntity addNode = new NodeEntity();

            addNode.SetNodeName(@"Comment");
            addNode.SetDepth(depth + 1);
            addNode.Comment(true);
            children.Add(addNode);
        }
示例#4
0
        public void AddChild(string name)
        {
            NodeEntity addNode = new NodeEntity();

            addNode.SetNodeName(name);
            addNode.SetDepth(depth + 1);
            addNode.Comment(false);
            children.Add(addNode);
        }
示例#5
0
        public bool IDExists(int arg)
        {
            NodeEntity r = Root();

            if (r.GetNodeID() == arg)
            {
                return(true);
            }
            return(IDExists(r, arg));
        }
示例#6
0
        public void Refresh()
        {
            NodeEntity r = Root();

            newDepth  = 0;
            newNodeId = 0;
            r.SetDepth(newDepth);
            r.SetNodeID(newNodeId);
            Refresh(r);
        }
示例#7
0
        private int TailID(NodeEntity arg)
        {
            int ret   = arg.GetNodeID();
            int count = arg.GetChildren().Count;

            if (count > 0)
            {
                ret = TailID(arg.GetChildren()[count - 1]);
            }
            return(ret);
        }
示例#8
0
        public NodeEntity FindTail(int depth)
        {
            NodeEntity ret = this;

            if (depth == 1)
            {
                return(ret);
            }
            depth--;
            int count = ret.GetChildren().Count;

            return(FindTail(ret.GetChildren()[count - 1], depth));
        }
示例#9
0
 private NodeEntity FindTail(NodeEntity node, int depth)
 {
     if (depth == 1)
     {
         return(node);
     }
     else
     {
         depth--;
         int count = node.GetChildren().Count;
         return(FindTail(node.GetChildren()[count - 1], depth));
     }
 }
示例#10
0
        private int TailDepth(NodeEntity arg)
        {
            int ret = arg.GetDepth();

            foreach (NodeEntity c in arg.GetChildren())
            {
                int cd = TailDepth(c);
                if (ret < cd)
                {
                    ret = cd;
                }
            }
            return(ret);
        }
示例#11
0
 public void SetWriterSetting(NodeEntity arg)
 {
     writerSetting = arg;
     newLineAfterOpeningBracket = NewLineAfterOpeningBracket();
     newLineAfterClosingBracket = NewLineAfterClosingBracket();
     newLineAfterAttributes     = NewLineAfterAttributes();
     newLineAfterNodeValue      = NewLineAfterNodeValue();
     indentSize = IndentSize();
     if (children.Count > 0)
     {
         children.ForEach(c => {
             c.SetWriterSetting(arg);
         });
     }
 }
示例#12
0
        private void ParseAttributes(XmlReader reader, NodeEntity currentNode)
        {
            int iLoopCount = reader.AttributeCount;

            for (int i = 0; i < iLoopCount; i++)
            {
                reader.MoveToAttribute(i);
                string          attrName  = reader.LocalName;
                string          attrValue = reader.GetAttribute(attrName);
                AttributeEntity attr      = new AttributeEntity();
                attr.SetAttrName(attrName);
                attr.SetAttrValue(attrValue);
                currentNode.AddAttr(attr);
            }
        }
示例#13
0
 private void Refresh(NodeEntity node)
 {
     newDepth++;
     foreach (NodeEntity c in node.GetChildren())
     {
         c.SetDepth(newDepth);
         newNodeId++;
         c.SetNodeID(newNodeId);
         if (c.GetChildren().Count > 0)
         {
             Refresh(c);
             newDepth--;
         }
     }
 }
示例#14
0
 public NodeEntity()
 {
     nodeId        = 0;
     depth         = 0;
     isComment     = false;
     attrList      = new List <AttributeEntity>();
     parent        = null;
     children      = new List <NodeEntity>();
     writerSetting = null;
     newLineAfterOpeningBracket = true;
     newLineAfterClosingBracket = true;
     newLineAfterAttributes     = true;
     newLineAfterNodeValue      = true;
     indentSize = 2;
 }
示例#15
0
 private NodeEntity FindByID(NodeEntity node, int id)
 {
     foreach (NodeEntity c in node.GetChildren())
     {
         if (c.GetNodeID() == id)
         {
             return(c);
         }
         NodeEntity ret = FindByID(c, id);
         if (ret != null)
         {
             return(ret);
         }
     }
     return(null);
 }
示例#16
0
        public NodeEntity CloneWithoutChildren()
        {
            NodeEntity ret = new NodeEntity();

            attrList.ForEach(v => {
                ret.AddAttr(v.Clone());
            });

            ret.SetNodeName(nodeName);
            ret.SetNodeID(nodeId);
            ret.SetDepth(depth);
            ret.SetNodeValue(nodeValue);
            ret.Comment(isComment);

            return(ret);
        }
示例#17
0
        protected void ParseComment(XmlReader reader)
        {
            if (reader.NodeType != XmlNodeType.Comment)
            {
                return;
            }

            NodeEntity newNode = new NodeEntity();

            newNode.SetNodeName(@"Comment");
            newNode.SetNodeID(currentNodeId);
            newNode.SetDepth(depth);
            newNode.SetNodeValue(reader.Value.Trim());
            newNode.Comment(true);
            currentNodeId++;
            node.FindTail(depth).AddChild(newNode);
        }
示例#18
0
        public void RemoveByID(int arg)
        {
            NodeEntity p = FindByID(arg).GetParent();

            if (p == null)
            {
                return;
            }
            for (int i = 0; i < p.GetChildren().Count; i++)
            {
                if (p.GetChildren()[i].GetNodeID() == arg)
                {
                    p.GetChildren().RemoveAt(i);
                    Refresh();
                    return;
                }
            }
        }
示例#19
0
        private bool IDExists(NodeEntity node, int id)
        {
            bool ret = false;

            foreach (NodeEntity c in node.GetChildren())
            {
                if (c.GetNodeID() == id)
                {
                    ret = true;
                }
                ret = IDExists(c, id);
                if (ret == true)
                {
                    return(true);
                }
            }
            return(ret);
        }
示例#20
0
        public void MoveByID(int moveFrom, int moveTo)
        {
            if (moveFrom == moveTo)
            {
                return;
            }
            NodeEntity nf = FindByID(moveFrom);

            if (nf == null)
            {
                return;
            }
            NodeEntity pf = nf.GetParent();

            if (pf == null)
            {
                return;
            }
            NodeEntity pt = FindByID(moveTo).GetParent();

            if (pt == null)
            {
                return;
            }
            nf = nf.Clone();
            for (int j = 0; j < pf.GetChildren().Count; j++)
            {
                if (pf.GetChildren()[j].GetNodeID() == moveFrom)
                {
                    pf.GetChildren().RemoveAt(j);
                    break;
                }
            }
            for (int i = 0; i < pt.GetChildren().Count; i++)
            {
                if (pt.GetChildren()[i].GetNodeID() == moveTo)
                {
                    pt.GetChildren().Insert(i, nf);
                    break;
                }
            }
            Refresh();
        }
示例#21
0
        protected void ParseElement(XmlReader reader)
        {
            if (reader.NodeType != XmlNodeType.Element)
            {
                return;
            }

            string     nodeName = reader.Name;
            NodeEntity newNode  = new NodeEntity();

            newNode.SetNodeName(nodeName);
            newNode.SetNodeID(currentNodeId);
            newNode.SetDepth(depth);
            newNode.Comment(false);
            currentNodeId++;
            node.FindTail(depth).AddChild(newNode);
            ParseAttributes(reader, newNode);

            if (!reader.IsEmptyElement)
            {
                depth++;
            }
        }
示例#22
0
        public void MoveDownByID(int arg)
        {
            NodeEntity p = FindByID(arg).GetParent();

            if (p == null)
            {
                return;
            }
            for (int i = 0; i < p.GetChildren().Count; i++)
            {
                if (p.GetChildren()[i].GetNodeID() == arg)
                {
                    if (i < p.GetChildren().Count - 1)
                    {
                        NodeEntity n = p.GetChildren()[i].Clone();
                        p.GetChildren().RemoveAt(i);
                        p.GetChildren().Insert(i + 1, n);
                        Refresh();
                        return;
                    }
                }
            }
        }
示例#23
0
 public void SetNode(NodeEntity arg)
 {
     node = arg;
 }
示例#24
0
 public void SetParent(NodeEntity arg)
 {
     parent = arg;
 }
示例#25
0
        public NodeEntity FindByID(int id)
        {
            NodeEntity r = Root();

            return(FindByID(r, id));
        }
示例#26
0
 public void AddChild(NodeEntity arg)
 {
     arg.SetParent(this);
     children.Add(arg);
 }
示例#27
0
        public int TailDepth()
        {
            NodeEntity r = Root();

            return(TailDepth(r));
        }
示例#28
0
        public int TailID()
        {
            NodeEntity r = Root();

            return(TailID(r));
        }