0

110,111,114,115,120,121,112,122,130,131という数字がありますが、xmlツリーに次のようにリストする必要があります。

 - 110
 - 111  
    -114
    -115
      -120
      -121
      -122
 - -112
   -130
   -131

つまり、数値x [i+1]がx[i]+1の場合、両方が同じツリーの子として追加されます。それ以外の場合、x [i+1]はx[i]の子ツリーに追加されます

私はそれが再帰的に行われなければならないことを知っています、しかし私はそれを正しくすることができないほど愚かですか?助けが切実に必要です。

4

4 に答える 4

0

UPDATED (順序付け) RESULT XML:

  <root>
     <node value="110" />
     <node value="111">
         <node value="114" />
         <node value="115">
             <node value="120" />
             <node value="121" />
         </node>
     </node>
     <node value="112">
         <node value="122">
            <node value="130" />
            <node value="131" />
         </node>
     </node>
   </root>

私はこのコードの順序を考慮していました

XmlDocument doc = new XmlDocument();
int[] numArray = new int[] { 110, 111, 114, 115, 120, 121, 112, 122, 130, 131 };
XmlElement head = doc.CreateElement("root");      
doc.AppendChild(head);

XmlElement cur = doc.CreateElement("node");
cur.SetAttribute("value", numArray[0].ToString());
head.AppendChild(cur);
int pos = 0;
BuildXml(numArray, ref pos, ref doc, head, cur);

そして再帰関数

public static void BuildXml(int[] numArray, ref int pos, ref XmlDocument doc, XmlElement parNode, XmlElement curNode)
{
    if (pos < numArray.Length-1)
    {
        if (numArray[pos] + 1 == numArray[pos + 1])
        {
            XmlElement current = doc.CreateElement("node");
            current.SetAttribute("value", numArray[pos + 1].ToString());
            parNode.AppendChild(current);
            pos++;
            BuildXml(numArray, ref pos, ref doc, parNode, current);
        }
        else if (numArray[pos] < numArray[pos + 1])
        {
            XmlElement current = doc.CreateElement("node");
            current.SetAttribute("value", numArray[pos + 1].ToString());
            curNode.AppendChild(current);
            pos++;
            BuildXml(numArray, ref pos, ref doc, curNode, current);
        }
        else
        {
            XmlElement elem = null;
            foreach (XmlElement nodes in doc.FirstChild.ChildNodes) GetNode(nodes, numArray[pos + 1], ref elem);                
            XmlElement current = doc.CreateElement("node");
            current.SetAttribute("value", numArray[pos + 1].ToString());
            ((XmlElement)elem.ParentNode).AppendChild(current);
            pos++;
            BuildXml(numArray, ref pos, ref doc, ((XmlElement)elem.ParentNode), current);
        }         
    }
}

public static void GetNode(XmlElement elem, int val, ref XmlElement found)
{
    if (int.Parse(elem.GetAttribute("value")) < val)
        if (found == null || int.Parse(found.GetAttribute("value")) < val) found = elem;
    foreach (XmlElement childElem in elem.ChildNodes) GetNode(childElem, val, ref found);
}
于 2013-03-06T08:00:51.547 に答える
0

つまり、数値 x[i+1] が x[i] +1 の場合、両方が同じツリーの子として追加されます。そうでない場合、x[i+1] は x[i] の子ツリーに追加されます

この説明によると、あなたはツリーの高いレベルには上がりません。したがって、ツリーは次のようになります。

- 110
 - 111  
    -114
    -115
      -120
      -121
      -122
        -112
          -130
          -131

最後の親を追跡し、x[i+1] <> x[i] +1 の場合、親を最後のノードに再割り当てします。そして、保存された親に新しいノードを追加します

于 2013-03-06T07:48:56.130 に答える
0

実際にはあなたが説明したとおりに機能しますが、その説明は再帰的ではなく線形です。

数値 x[i+1] が x[i] +1 の場合、両方が同じツリーの子として追加されます。そうでない場合、x[i+1] は x[i] の子ツリーに追加されます

したがって、これは前のノードを xml ドキュメントのルート要素に初期化する単なるループです。提供された数列について

110,111,114,115,120,121,112,122,130,131 

次に、次の XML ( PHP の例)を生成します。

<?xml version="1.0"?>
<root>
  <node value="110"/>
  <node value="111">
    <node value="114"/>
    <node value="115">
      <node value="120"/>
      <node value="121">
        <node value="112">
          <node value="122">
            <node value="130"/>
            <node value="131"/>
          </node>
        </node>
      </node>
    </node>
  </node>
</root>

したがって、コードを記述する前に、まず、実際にどのロジックに従いたいかをより適切に指定する必要があると思います。明確でない限り、再帰、xpath 式などで解決するかどうかを決定することはできません。

于 2013-03-06T07:44:21.267 に答える
0

スタックが必要です。

stack<int> nodeHierarchy;

次に、アルゴリズムは単純です。要素が以前よりも高いかどうかを確認します。もしそうなら、それはその兄弟か子供のどちらかでしょう。

それ以外の場合は、スタックに戻ってやり直す必要があります。

要素が兄弟になる場合は、スタックをもう一度戻る必要があります。

ルートが 0 で、他のすべての要素が 0 より大きいと仮定します。

nodeHierarchy.push(0); //root
foreach(int element){
    while(nodeHierarchy.top() + 1 >= element)nodeHierarchy.pop();
    //put element as next nodeHierarchy.top() child
    nodeHierarchy.push(element);
}

それがあなたの考えだと思いますが、あなたはそれを間違って説明しました。私が間違っている場合、他の2つの答えは正しいはずです。

于 2013-03-06T07:53:33.630 に答える