1

我拥有构建 XML 所需的所有 xpath。所以我需要用 xpaths 和相关的值来构建这个 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>

你可以看到不同的innerText[与]相同的标签<Official>o</Official>和重复标签。但是当我尝试创建这样的 XML 时,输出如下:<Official>r</Official><Sex><Field1>m</Field1><Field1>f</Field1></Sex>

<Sex>
  <Field1>m, f</Field1>
</Sex>

<Official>o, r</Official>

以下是我用来基于 xpaths 创建节点的代码:

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

那么我如何创建单独的标签而不是用逗号分隔的内部文本的单个标签。

编辑我

我发现了问题,我将 xpath 和相应的值作为查询字符串发送到此页面。现在对于我的情况,如果存在多个相同的标签,Request.QueryString 会产生逗号分隔值[例如:m,f]。

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

有没有修复???就像我应该如何调用该函数来添加具有一些属性的节点,这些属性使相同的 xpath 节点成为不同的节点。提前致谢。

4

1 回答 1

1

据我了解您的代码,当您想要创建第二个节点时,makeXPath 函数将在第一个循环 中Official找到一个现有节点。将返回这个现有节点,然后您将在不创建新节点的情况下设置。我相信你应该在第一个循环之前检查完整路径的存在,然后创建兄弟。Officialfornode = doc.SelectSingleNode(subXpath)innerTextfor

就像是

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;
    }
于 2013-03-13T10:48:29.573 回答