C# 在基于Xpath的XML中添加节点,并在同一父节点中添加多个类似标记
我拥有构建XML所需的所有XPath。所以我需要用XPath和相关值构建这个XML。但在某些情况下,XML可能需要在同一父级中具有相同的标记,如下所示:C# 在基于Xpath的XML中添加节点,并在同一父节点中添加多个类似标记,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我拥有构建XML所需的所有XPath。所以我需要用XPath和相关值构建这个XML。但在某些情况下,XML可能需要在同一父级中具有相同的标记,如下所示: <root> <Name> <Address> <Fname>bbb</Fname> <Lname>bbb</Lname> <Official>o</Official> <
<root>
<Name>
<Address>
<Fname>bbb</Fname>
<Lname>bbb</Lname>
<Official>o</Official>
<Official>r</Official>
<District>Ekm Edited</District>
<State>Kerala Edited</State>
</Address>
<Sex>
<Field1>m</Field1>
<Field1>f</Field1>
</Sex>
<Qualification>
<EDUCATION>10</EDUCATION>
</Qualification>
</Name>
</root>
<Sex>
<Field1>m, f</Field1>
</Sex>
bbb
bbb
o
R
Ekm编辑
喀拉拉邦编辑
M
F
10
您可以看到标签o
和r
使用不同的内部文本重复标签[与mf
]相同]。但当我尝试创建这样一个XML时,输出如下:
<root>
<Name>
<Address>
<Fname>bbb</Fname>
<Lname>bbb</Lname>
<Official>o</Official>
<Official>r</Official>
<District>Ekm Edited</District>
<State>Kerala Edited</State>
</Address>
<Sex>
<Field1>m</Field1>
<Field1>f</Field1>
</Sex>
<Qualification>
<EDUCATION>10</EDUCATION>
</Qualification>
</Name>
</root>
<Sex>
<Field1>m, f</Field1>
</Sex>
m、 f
和o,r
以下是我用于基于XPath创建节点的代码:
public XmlNode makeXPath(XmlDocument doc, string xpath, string innertext)
{
string[] partsOfXPath = xpath.Split('/');
XmlNode node = null;
for (int xpathPos = partsOfXPath.Length; xpathPos > 0; xpathPos--)
{
string subXpath = string.Join("/", partsOfXPath, 0, xpathPos);
node = doc.SelectSingleNode(subXpath);
if (node != null)
{
// append new descendants
for (int newXpathPos = xpathPos; newXpathPos < partsOfXPath.Length; newXpathPos++)
{
node = node.AppendChild(doc.CreateElement(partsOfXPath[newXpathPos]));
}
break;
}
}
node.InnerText = innertext.TrimStart(' ');
return node;
}
公共XmlNode makeXPath(XmlDocument文档、字符串xpath、字符串innertext)
{
字符串[]partsOfXPath=xpath.Split('/');
XmlNode=null;
对于(int-xpathPos=partsOfXPath.Length;xpathPos>0;xpathPos--)
{
string subXpath=string.Join(“/”,partsOfXPath,0,xpathPos);
node=doc.SelectSingleNode(子XPath);
如果(节点!=null)
{
//追加新的后代
for(int newXpathPos=xpathPos;newXpathPos提前感谢。根据我对代码的理解,当您想要创建第二个
官方
节点时,makeXPath函数将在第一个for
循环中找到一个现有的官方
节点。
node=doc。选择SingleNode(subXpath)
将返回此现有节点,然后您将设置innerText
,而不创建新节点。
我认为您应该在第一个for
循环之前检查完整路径的存在性,然后创建同级
差不多
public XmlNode makeXPath(XmlDocument doc, string xpath, string innertext)
{
string[] partsOfXPath = xpath.Split('/');
XmlNode node = null;
if (doc.SelectSingleNode(xpath) != null) {
//get the parent
node = doc.SelectSingleNode(string.Join("/", partsOfXPath, 0, partsOfXPath.Length-1));
node = node.AppendChild(doc.CreateElement(xpath));
node.InnerText = innertext.TrimStart(' ');
}
else {
for (int xpathPos = partsOfXPath.Length; xpathPos > 0; xpathPos--)
{
string subXpath = string.Join("/", partsOfXPath, 0, xpathPos);
node = doc.SelectSingleNode(subXpath);
if (node != null)
{
// append new descendants
for (int newXpathPos = xpathPos; newXpathPos < partsOfXPath.Length; newXpathPos++)
{
node = node.AppendChild(doc.CreateElement(partsOfXPath[newXpathPos]));
}
break;
}
}
node.InnerText = innertext.TrimStart(' ');
}
return node;
}
公共XmlNode makeXPath(XmlDocument文档、字符串xpath、字符串innertext)
{
字符串[]partsOfXPath=xpath.Split('/');
XmlNode=null;
if(doc.SelectSingleNode(xpath)!=null){
//找到父母
node=doc.SelectSingleNode(string.Join(“/”,partsOfXPath,0,partsOfXPath.Length-1));
node=node.AppendChild(doc.CreateElement(xpath));
node.InnerText=InnerText.TrimStart(“”);
}
否则{
对于(int-xpathPos=partsOfXPath.Length;xpathPos>0;xpathPos--)
{
string subXpath=string.Join(“/”,partsOfXPath,0,xpathPos);
node=doc.SelectSingleNode(子XPath);
如果(节点!=null)
{
//追加新的后代
for(int newXpathPos=xpathPos;newXpathPos官方
节点时,makeXPath函数将在第一个for
循环中找到一个现有的官方
节点。
node=doc。选择SingleNode(subXpath)
将返回此现有节点,然后您将设置innerText
,而不创建新节点。
我认为您应该在第一个for
循环之前检查完整路径的存在性,然后创建同级
差不多
public XmlNode makeXPath(XmlDocument doc, string xpath, string innertext)
{
string[] partsOfXPath = xpath.Split('/');
XmlNode node = null;
if (doc.SelectSingleNode(xpath) != null) {
//get the parent
node = doc.SelectSingleNode(string.Join("/", partsOfXPath, 0, partsOfXPath.Length-1));
node = node.AppendChild(doc.CreateElement(xpath));
node.InnerText = innertext.TrimStart(' ');
}
else {
for (int xpathPos = partsOfXPath.Length; xpathPos > 0; xpathPos--)
{
string subXpath = string.Join("/", partsOfXPath, 0, xpathPos);
node = doc.SelectSingleNode(subXpath);
if (node != null)
{
// append new descendants
for (int newXpathPos = xpathPos; newXpathPos < partsOfXPath.Length; newXpathPos++)
{
node = node.AppendChild(doc.CreateElement(partsOfXPath[newXpathPos]));
}
break;
}
}
node.InnerText = innertext.TrimStart(' ');
}
return node;
}
公共XmlNode makeXPath(XmlDocument文档、字符串xpath、字符串innertext)
{
字符串[]partsOfXPath=xpath.Split('/');
XmlNode=null;
if(doc.SelectSingleNode(xpath)!=null){
//找到父母
node=doc.SelectSingleNode(string.Join(“/”,partsOfXPath,0,partsOfXPath.Length-1));
node=node.AppendChild(doc.CreateElement(xpath));
node.InnerText=InnerText.TrimStart(“”);
}
否则{
对于(int-xpathPos=partsOfXPath.Length;xpathPos>0;xpathPos--)
{
string subXpath=string.Join(“/”,partsOfXPath,0,xpathPos);
node=doc.SelectSingleNode(子XPath);
如果(节点!=null)
{
//追加新的后代
for(int newXpathPos=xpathPos;newXpathPos