使用XSD信息通过XPATH表达式构建XML?

时间:2017-11-03 22:17:26

标签: c# xml xpath xsd

XPATH表达式问题的类似构建XML可以在Java End中找到:

我们知道,有许多工具可以从XSD文件生成XML,我已经有了下面的NOT-SO-ROBUST代码来通过XPATH表达式构建XML。

但是,它无法处理复杂的情况。结合来自XSD的信息,理想情况下,我们应该能够处理任何场景,并通过XPATH表达式构建XML。

我想知道,是否有人已经这样做了?

这个topic不是重复的问题。下面的代码已经可以处理简单的节点创建我需要强调的是,有许多不同的xml样式,如果我们只关注xml本身,没有XSD信息,输出是不可预测的,它可以工作,或者因为异常而卡住。

            XmlNode node=xmlDoc.SelectSingleNode(xpath,nsmgr);

            if(node==null){
                node=makeXPath(xmlDoc,nsmgr, xpath);
            }

            if(node is XmlAttribute){

                XmlAttribute formId = (XmlAttribute) node;
                if (formId != null)
                {
                    formId.Value = value1; // Set to new value.
                }
            }
            else if (node is XmlElement){
                XmlElement formData = (XmlElement)node;
                if (formData != null)
                {
                    formData.InnerText=value1; // Set to new value.
                }
            }

....... ....... ....... ....... ....... .......

        static private XmlNode makeXPath(XmlDocument doc,XmlNamespaceManager nsmgr, string xpath)
        {
            return makeXPath(doc, nsmgr,doc as XmlNode, xpath);
        }

        static private XmlNode makeXPath(XmlDocument doc, XmlNamespaceManager nsmgr,XmlNode parent, string xpath)
        {
            // grab the next node name in the xpath; or return parent if empty
            string[] partsOfXPath = xpath.Trim('/').Split('/');
            string nextNodeInXPath = partsOfXPath.First();
            if (string.IsNullOrEmpty(nextNodeInXPath))
                return parent;

            XmlNode node = parent.SelectSingleNode(nextNodeInXPath,nsmgr);
            if (node == null){
                string nextNodeInXPath_new=new Regex(@"\[\d+\]").Replace(nextNodeInXPath,"");
                node = parent.AppendChild(doc.CreateElement(nextNodeInXPath_new));
            }

            string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
            return makeXPath(doc, nsmgr,node, rest);
        }

0 个答案:

没有答案