// 根据xml编辑框中的内容创建后代 void BuildDescendant() { // 采用加虚根的方法 //this.SetFreshValue(); Debug.Assert(this.m_childrenExpand == ExpandStyle.Collapse, "不是闭合状态不要用本函数"); string strAdditionalNsString = ""; string strInnerXml = ""; // 2.得到attributes关闭时的text XmlText oText = this.GetContentText(); if (oText != null) { strInnerXml = oText.Text.Trim(); } else { Debug.Assert(false, "必须有text对象"); } NamespaceItemCollection nsColl = NamespaceItemCollection.GatherOuterNamespaces( (ElementItem)this); if (nsColl.Count > 0) { strAdditionalNsString = nsColl.MakeAttrString(); } string strXml = ""; if (this == this.m_document.VirtualRoot) { strXml = strInnerXml; } else { strXml = "<root "+ strAdditionalNsString + " >\r\n" + strInnerXml + "</root>"; } this.ClearChildren(); this.children = new ItemList(); XmlDocument dom = new XmlDocument(); dom.LoadXml(strXml); XmlNode root = null; if (this == this.m_document.VirtualRoot) { root = dom; } else { root = dom.DocumentElement; } foreach(XmlNode node in root.ChildNodes) { Item item = this.m_document.allocator.newItem(node, this.m_document); ElementInitialStyle style = new ElementInitialStyle(); style.attrsExpandStyle = ExpandStyle.Expand; style.childrenExpandStyle = ExpandStyle.Expand; style.bReinitial = false; item.Initial(node, this.m_document.allocator, style, true); // 这个函数是为Flush服务的函数,所以不应再使用时间戳加大 this.AppendChildInternal(item,false,true); } }
public ItemList SelectItems(string strXpath, XmlNamespaceManager mngr) { ItemList items = new ItemList(); XPathNavigator nav = this.CreateNavigator(); XPathExpression expr = nav.Compile(strXpath); expr.SetContext(mngr); XPathNodeIterator ni = nav.Select(expr); while(ni.MoveNext()) { Item item = ((XmlEditorNavigator)ni.Current).Item; items.Add(item); } return items; }
// 根据xml编辑框中的内容创建属性 void BuildAttrs() { //this.SetFreshValue(); Debug.Assert(m_attrsExpand == ExpandStyle.Collapse, "不是闭合状态不要用本函数"); NameTable nt = new NameTable(); // 创建名字空间 XmlNamespaceManager nsmgr = GatherOuterNamespaces( this, nt); XmlParserContext context = new XmlParserContext(nt, nsmgr, null, XmlSpace.None); string strAttrsXml = ""; // 2.得到attributes关闭时的text XmlText oText = this.GetAttributesText(); if (oText != null) { strAttrsXml = oText.Text.Trim(); if (strAttrsXml != "") strAttrsXml = " " + strAttrsXml; } else { Debug.Assert(false, "必须有text对象"); } string strFragmentXml = "<" + this.Name + strAttrsXml + "/>"; /* TextReader tr = new StringReader(strFragmentXml); XmlReaderSettings settings = new XmlReaderSettings(); settings..XmlResolver = resolver; XmlReader reader = XmlReader.Create(tr, settings, context); * */ // 过一段时间做XmlSchema校验 XmlValidatingReader reader = new XmlValidatingReader(strFragmentXml, XmlNodeType.Element, context); // 不根据schema进行校验 reader.ValidationType = ValidationType.None; this.attrs = new ItemList(); while(true) { if (reader.Read() == false) break; if (reader.MoveToFirstAttribute() == false) goto CONTINUE; while(true) { AttrItem attr = this.m_document.CreateAttrItem(reader.Name); attr.Initial(reader); this.AppendAttrInternal(attr,false,true); if (reader.MoveToNextAttribute() == false) break; } CONTINUE: break; } }
// strXpath 可以是相对路径 public ItemList SelectItems(string strXpath) { ItemList items = new ItemList(); XPathNavigator nav = this.CreateNavigator(); XPathNodeIterator ni = nav.Select(strXpath); while(ni.MoveNext()) { Item item = ((XmlEditorNavigator)ni.Current).Item; items.Add(item); } return items; }