示例#1
0
        private string GetDtdSubset(INode documentNode, Context context)
        {
            using (var nullWriter = CreateNullWriter())
            {
                foreach (var value in GetValues(documentNode))
                {
                    if (WriteValue(nullWriter, value, context))
                    {
                        break;
                    }
                }
                var sb = new StringBuilder();
                sb.AppendLine();
                foreach (var pair in context.Entities)
                {
                    var key  = pair.Key;
                    var name = pair.Value;

                    var pubId = UriTools.ExtractPublicId(pair.Key);
                    if (pubId != null)
                    {
                        var sysId = graph.FindObject(graph.CreateUriNode(key), isDefinedBy).OfType <IUriNode>().FirstOrDefault()?.Uri;
                        if (sysId == null)
                        {
                            sysId = key;
                        }
                        sb.AppendLine($"<!ENTITY {name} PUBLIC \"{pubId}\" \"{sysId.GetString()}\">");
                    }
                    else
                    {
                        sb.AppendLine($"<!ENTITY {name} SYSTEM \"{key.GetString()}\">");
                    }
                }
                return(sb.ToString());
            }
        }
示例#2
0
        private void WriteDocumentType(XmlWriter writer, INode documentNode, Context context)
        {
            var root = GetRootType(documentNode);

            if (root == null)
            {
                return;
            }

            var classes = graph.FindObject(documentNode, a);

            var entitySubset = GetDtdSubset(documentNode, context);

            foreach (var cls in classes)
            {
                if (graph.FindObject(cls, subClassOf).FirstOrDefault() is IUriNode publicNode)
                {
                    if (UriTools.ExtractPublicId(publicNode.Uri) is string pubId)
                    {
                        if (graph.FindObject(publicNode, isDefinedBy).FirstOrDefault() is IUriNode systemNode)
                        {
                            var subset = GetValues(cls).OfType <ILiteralNode>().FirstOrDefault();
                            writer.WriteDocType(root, pubId, systemNode.Uri.GetString(), subset?.Value + entitySubset);
                            return;
                        }
                    }
                }
            }

            foreach (var cls in classes)
            {
                if (graph.FindObject(cls, subClassOf).FirstOrDefault() is IUriNode publicNode)
                {
                    if (UriTools.ExtractPublicId(publicNode.Uri) is string pubId)
                    {
                        var subset = GetValues(cls).OfType <ILiteralNode>().FirstOrDefault();
                        writer.WriteDocType(root, pubId, null, subset?.Value + entitySubset);
                        return;
                    }
                }
            }

            foreach (var cls in classes.OfType <IUriNode>())
            {
                if (UriTools.ExtractPublicId(cls.Uri) is string pubId)
                {
                    if (graph.FindObject(cls, isDefinedBy).FirstOrDefault() is IUriNode systemNode)
                    {
                        writer.WriteDocType(root, pubId, systemNode.Uri.GetString(), entitySubset);
                        return;
                    }
                }
            }

            foreach (var cls in classes.OfType <IUriNode>())
            {
                if (UriTools.ExtractPublicId(cls.Uri) is string pubId)
                {
                    writer.WriteDocType(root, pubId, null, entitySubset);
                    return;
                }
            }

            foreach (var cls in classes)
            {
                var subset = GetValues(cls).OfType <ILiteralNode>().FirstOrDefault();
                if (subset != null)
                {
                    writer.WriteDocType(root, null, null, subset.Value + entitySubset);
                    return;
                }
            }

            if (!String.IsNullOrEmpty(entitySubset))
            {
                writer.WriteDocType(root, null, null, entitySubset);
            }
        }
示例#3
0
            public XDocumentType GetDocumentType(string root)
            {
                var classes = FindObject(DocumentNode, a);

                foreach (var cls in classes)
                {
                    if (FindObject(cls, subClassOf).FirstOrDefault() is IUriNode publicNode)
                    {
                        if (UriTools.ExtractPublicId(publicNode.Uri) is string pubId)
                        {
                            if (FindObject(publicNode, isDefinedBy).FirstOrDefault() is IUriNode systemNode)
                            {
                                var subset = FindObject(cls, value).OfType <ILiteralNode>().FirstOrDefault();
                                return(new XDocumentType(root, pubId, systemNode.Uri.GetString(), subset?.Value));
                            }
                        }
                    }
                }

                foreach (var cls in classes)
                {
                    if (FindObject(cls, subClassOf).FirstOrDefault() is IUriNode publicNode)
                    {
                        if (UriTools.ExtractPublicId(publicNode.Uri) is string pubId)
                        {
                            var subset = FindObject(cls, value).OfType <ILiteralNode>().FirstOrDefault();
                            return(new XDocumentType(root, pubId, null, subset?.Value));
                        }
                    }
                }

                foreach (var cls in classes.OfType <IUriNode>())
                {
                    if (UriTools.ExtractPublicId(cls.Uri) is string pubId)
                    {
                        if (FindObject(cls, isDefinedBy).FirstOrDefault() is IUriNode systemNode)
                        {
                            return(new XDocumentType(root, pubId, systemNode.Uri.GetString(), null));
                        }
                    }
                }

                foreach (var cls in classes.OfType <IUriNode>())
                {
                    if (UriTools.ExtractPublicId(cls.Uri) is string pubId)
                    {
                        return(new XDocumentType(root, pubId, null, null));
                    }
                }

                foreach (var cls in classes)
                {
                    var subset = FindObject(cls, value).OfType <ILiteralNode>().FirstOrDefault();
                    if (subset != null)
                    {
                        return(new XDocumentType(root, null, null, subset.Value));
                    }
                }

                return(null);
            }