Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在基于Xpath的XML中添加节点,并在同一父节点中添加多个类似标记_C#_Xml_Xml Serialization - Fatal编程技术网

C# 在基于Xpath的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> <

我拥有构建XML所需的所有XPath。所以我需要用XPath和相关值构建这个XML。但在某些情况下,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>

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 那么,如何创建单独的标记,而不是使用逗号分隔的内部文本创建单个标记呢

编辑I

我发现了问题,我将XPath和相应的值作为查询字符串发送到此页面。在我的例子中,如果存在多个相同的标记,Request.QueryString将生成逗号分隔的值[例如:m,f]

我尝试向节点添加一个属性,但这只添加逗号分隔数据中的最后一个数据

有办法吗???例如,我应该如何调用函数来添加具有某些属性的节点,这些属性使相同的xpath节点成为不同的节点。
提前感谢。

根据我对代码的理解,当您想要创建第二个
官方
节点时,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