1

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>

異なる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>

以下は、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がコンマで区切られた単一のタグではなく、個別のタグを作成するにはどうすればよいですか。

私を編集

問題を見つけました。xpathと対応する値をクエリ文字列としてこのページに送信していました。ここで、同じタグが複数存在する私の場合、Request.QueryStringはコンマ区切りの値を生成します[例:m、f]。

ノードに属性を追加しようとしましたが、コンマ区切りのデータの最後のデータのみが追加されます。

修正はありますか?同じxpathノードを異なるノードにするいくつかの属性を持つノードを追加する関数をどのように呼び出すべきかと同じように。前もって感謝します。

4

1 に答える 1

1

私があなたのコードを理解しているように、2番目のノードを作成したいときOfficial、makeXPath関数はOfficial最初のforループで既存のノードを見つけます。 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;
    }
于 2013-03-13T10:48:29.573 に答える