public void AcbValidationTest() { MCContext mcContext = new MCContext(); ParagraphProperties pPr; Run run1, run2; Paragraph p = new Paragraph(pPr = new ParagraphProperties() { WordWrap = new WordWrap() { Val = true } }, new OpenXmlMiscNode(System.Xml.XmlNodeType.Comment, "<!-- comments -->"), run1 = new Run(new Text("Text 1.")), run2 = new Run(new Text("Text 2."))); p.AddNamespaceDeclaration("w14test", "http://w14.com"); OpenXmlUnknownElement ignorableElement = new OpenXmlUnknownElement("w14test", "span", "http://w14.com"); ignorableElement.MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "w14test" }; p.InsertAfter(ignorableElement, pPr); Run runInAcb = new Run(new Text("Text in ACB.")); Run run2InAcb = new Run(new Text("Text 2 in ACB.")); AlternateContent acb = new AlternateContent(new AlternateContentChoice() { Requires = "w14test" }, new AlternateContentFallback(runInAcb, run2InAcb)); p.InsertAfter(acb, pPr); var validator = new OpenXmlValidator(); var errors = validator.Validate(p); Assert.Equal(0, errors.Count()); p.AppendChild(new OpenXmlUnknownElement("w15test", "art", "http://w15.com")); errors = validator.Validate(p); Assert.Equal(1, errors.Count()); p.RemoveChild(p.LastChild); acb.LastChild.Append(new OpenXmlUnknownElement("w15test", "art", "http://w15.com")); errors = validator.Validate(p); Assert.Equal(1, errors.Count()); }
/// <summary> /// Initializes a new instance of the OpenXmlElementContext class. /// </summary> public OpenXmlElementContext() { // this._xmlParserContext = new XmlParserContext( _xmlNameTable = new NameTable(); MCContext = new MCContext(); Init(); }
private static OpenXmlElement GetChildMc(this OpenXmlElement parent, OpenXmlElement child, MCContext mcContext, FileFormatVersions format) { // Use stack to cache the next siblings in different levels. Stack<OpenXmlElement> nextSiblings = new Stack<OpenXmlElement>(); while (child != null) { var acb = child as AlternateContent; if (acb == null && child.IsInVersion(format)) { return child; } else { mcContext.PushMCAttributes2(child.MCAttributes, child.LookupNamespace); if (acb != null) { nextSiblings.Push(child.GetNextNonMiscElementSibling()); var select = mcContext.GetContentFromACBlock(acb, format); if (select != null) { child = select.GetFirstNonMiscElementChild(); } else { // The ACB has no children elements. // case like: <acb/> <acb><choice/><fallback/></acb> child = null; } } else { // Ignorable element, skip it if (mcContext.IsIgnorableNs(child.NamespaceUri)) { // Any element marked with ProcessContent should be an Ignorable Element if (mcContext.IsProcessContent(child)) { nextSiblings.Push(child.GetNextNonMiscElementSibling()); // child = child.GetFirstNonMiscElementChild(); } else { child = child.GetNextNonMiscElementSibling(); } } else { mcContext.PopMCAttributes2(); return child; } } mcContext.PopMCAttributes2(); } while (child == null && nextSiblings.Count > 0) { child = nextSiblings.Pop(); } } // child is null. return child; }
internal static OpenXmlElement GetNextChildMc(this OpenXmlElement parent, OpenXmlElement child, MCContext mcContext, FileFormatVersions format) { var next = child.GetNextNonMiscElementSibling(); var mcTier = child.Parent; if (next == null && mcTier != parent) { // the child must be under element in ProcessContent or ACB if (mcTier is AlternateContentChoice || mcTier is AlternateContentFallback) { mcTier = mcTier.Parent; } Debug.Assert(mcTier != null); // there is no more next sibling in this level, then try to find the next siblig of the up level. return parent.GetNextChildMc(mcTier, mcContext, format); } return parent.GetChildMc(next, mcContext, format); }
internal static OpenXmlElement GetFirstChildMc(this OpenXmlElement parent, MCContext mcContext, FileFormatVersions format) { var child = parent.GetFirstNonMiscElementChild(); return parent.GetChildMc(child, mcContext, format); }
/// <summary> /// Initializes a new instance of the OpenXmlElementContext class. /// </summary> public OpenXmlElementContext() { MCContext = new MCContext(); XmlReaderSettings = CreateDefaultXmlReaderSettings(); }
public void GetChildMcTest() { MCContext mcContext = new MCContext(); ParagraphProperties pPr; Run run1, run2; Paragraph p = new Paragraph(pPr = new ParagraphProperties() { WordWrap = new WordWrap() { Val = true } }, new OpenXmlMiscNode(System.Xml.XmlNodeType.Comment, "<!-- comments -->"), run1 = new Run(new Text("Text 1.")), run2 = new Run(new Text("Text 2."))); var target = p.GetFirstChildMc(mcContext, FileFormatVersions.Office2007); Assert.Same(pPr, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run1, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run2, target); OpenXmlUnknownElement ignorableElement = new OpenXmlUnknownElement("w14test", "span", "http://w14.com"); p.AddNamespaceDeclaration("w14test", "http://w14.com"); ignorableElement.MCAttributes = new MarkupCompatibilityAttributes() { Ignorable="w14test" }; p.InsertAfter(ignorableElement, pPr); mcContext = new MCContext(); target = p.GetFirstChildMc(mcContext, FileFormatVersions.Office2007); Assert.Same(pPr, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run1, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run2, target); Run runInAcb = new Run(new Text("Text in ACB.")); AlternateContent acb = new AlternateContent(new AlternateContentChoice() { Requires = "w14test" }, new AlternateContentFallback(runInAcb)); p.InsertAfter(acb, pPr); mcContext = new MCContext(); target = p.GetFirstChildMc(mcContext, FileFormatVersions.Office2007); Assert.Same(pPr, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(runInAcb, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run1, target); target = p.GetNextChildMc(target, mcContext, FileFormatVersions.Office2007); Assert.Same(run2, target); }
//public XmlNamespaceManager XmlNamespaceManager //{ // get { return _xmlNamespaceManager; } // // set { _xmlNamespaceManager = value; } //} //public XmlParserContext XmlParserContext //{ // get { return _xmlParserContext; } // //set { _xmlParserContext = value; } //} /// <summary> /// Initializes a new instance of the OpenXmlElementContext class. /// </summary> public OpenXmlElementContext() { // this._xmlParserContext = new XmlParserContext( this._xmlNameTable = new NameTable(); MCContext = new MCContext(); Init(); }