簡體   English   中英

根據Xpath在XML中添加節點,並在同一父級中添加多個相似標簽

[英]Add nodes in XML based on Xpath and also add multiple similar tags in same parent

我擁有構建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>

您可以看到標簽<Official>o</Official><Official>r</Official>重復的標簽具有不同的innerText [與<Sex><Field1>m</Field1><Field1>f</Field1></Sex> ]。 但是,當我嘗試創建這樣的XML時,輸出如下:

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

AND <Official>o, r</Official>

以下是我用於基於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;
    }

因此,如何創建單獨的標簽,而不是用逗號分隔的innerText創建單個標簽。

編輯我

我發現了問題,我正在將xpaths和相應的值作為查詢字符串發送到此頁面。 現在,對於我來說,如果存在多個相同的標記,則Request.QueryString會產生逗號分隔的值[例如:m,f]。

好吧,我嘗試向節點添加一個屬性,但是只將最后一個數據添加到逗號分隔的數據中。

任何修復??? 就像我應該如何調用該函數來添加具有某些屬性的節點,這些屬性使相同的xpath節點成為不同的節點。 提前致謝。

據我了解您的代碼,當您要創建第二個Official節點時,makeXPath函數將在第一個for循環中找到一個現有的Official節點。 node = doc.SelectSingleNode(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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM