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);
}