如何在Vb.NET中添加父节点 [英] How to add parent node in Vb.NET

查看:50
本文介绍了如何在Vb.NET中添加父节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我有一个XML文档(input.xml),显示我的应用程序中使用的菜单heirarchy

。我的要求是添加子菜单标记为那些具有子菜单项的
menuitems,如output.xml中所示。

我正在使用VB.NET框架1.1。


请帮助,我已经投入了2天但是无法构建逻辑

因为输入xml可能有任何级别的菜单项嵌套。


input.xml

************************************ ***

< menu>

< menuItem>

< text> HOME< / text>

< javascriptcommand> opennewwindow(''home.aspx'')< / javascriptcommand>

< cssclass> off< / cssclass>

< MENU_ID> 1< / MENU_ID>

< / menuItem>

< menuItem>

< text> QUERY< / text>

< javascriptcommand> openPopup(''fundSearch.aspx'',''Se arch'',580,

200)< / javascriptcommand>

< cssclass> off< / cssclass>

< MENU_ID> 2< / MENU_ID> ;

< / menuItem>

< menuItem>

< text> REPORTS< / text>

< cssclass> off< / cssclass>

< MENU_ID> 3< / MENU_ID>

< menuItem>

< text> ;标准报告< / text>

< MENU_ID> 5< / MENU_ID>

< PRNT_MENU_ID> 3< / PRNT_MENU_ID>

< ; menuItem>

< text> PM任期< / text>

< MENU_ID> 7< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text> Performance< / text>

< MENU_ID> 8< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>费用&费用< / text>

< MENU_ID> 9< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>情况说明书PDF< / text>

< MENU_ID> 10< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>基金事实< / text>

< MENU_ID> 11< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< / menuItem>

< menuItem>

< text>自定义报告< / text>

< MENU_ID> 6< / MENU_ID>

< PRNT_MENU_ID> 3< / PRNT_MENU_ID>

< menuItem>

< text>频谱< / text>

< MENU_ID> 12< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>表现< / text>

< MENU_ID> 13< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>描述< / text>

< MENU_ID> 14< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>基金操作< / text>

< MENU_ID> 15< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID> ;

< / menuItem>

< menuItem>

< text> Inv Svcs Only< / text>

< MENU_ID> 16< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< / menuItem>

< / menuItem>

< menuItem>

< text> HELP< / text>

< cssclass> off< / cssclass>

< MENU_ID> 4< / MENU_ ID>

< menuItem>

< text>常见问题< / text>

< MENU_ID> 17< / MENU_ID>

< PRNT_MENU_ID> 4< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

<文字>操作方法< / text>

< MENU_ID> 18< / MENU_ID>

< PRNT_MENU_ID> 4< / PRNT_MENU_ID>

< / menuItem>

< / menuItem>

< / menu>


output.xml

********************************************** **** ***

< menu>

< menuItem>

< text> HOME< / text>

< javascriptcommand> opennewwindow(''home.aspx'')< / javascriptcommand>

< cssclass> off< / cssclass>

< MENU_ID> 1< / MENU_ID>

< / menuItem>

< menuItem>

< text> QUERY< / text> ;

< javascriptcommand> openPopup(''fundSearch.a spx'',''Se arch'',580,

200)< / javascriptcommand>

< cssclass> off< / cssclass>

< MENU_ID> 2< / MENU_ID>

< / menuItem>

< menuItem>

< text> REPORTS< ; / text>

< cssclass> off< / cssclass>

< MENU_ID> 3< / MENU_ID>

< submenu>

< menuItem>

< text>标准报告< / text>

< MENU_ID> 5< / MENU_ID>

< PRNT_MENU_ID> 3< / PRNT_MENU_ID>

< submenu>

< menuItem>

< text> PM任期< / text>

< MENU_ID> 7< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text> Performance< / text>

< MENU_ID> 8< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>费用&费用< / text>

< MENU_ID> 9< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>情况说明书PDF< / text>

< MENU_ID> 10< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>基金事实< / text>

< MENU_ID> 11< / MENU_ID>

< PRNT_MENU_ID> 5< / PRNT_MENU_ID>

< / menuItem>

< / submenu>

< / menuItem>

< menuItem>

< text>自定义报告< / text>

< MENU_ID> 6< / MENU_ID>

< PRNT_MENU_ID> 3< / PRNT_MENU_ID>

< submenu>

< menuItem>

< text> Spectrums< / text>

< MENU_ID> 12< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text> Performance< / text>

< MENU_ID> 13< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>说明< / text>

< MENU_ID> 14< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text>基金操作< / text>

< ; MENU_ID> 15< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< text> Inv Svcs Only< / text>

< MENU_ID> 16< / MENU_ID>

< PRNT_MENU_ID> 6< / PRNT_MENU_ID>

< / menuItem>

< / submenu>

< / menuItem>

< / submenu>

< / menuItem>

< menuItem>

< text> HELP< / text>

< cssclass> off< / cssclass>

< MENU_ID> 4< / MENU_ID>

< ;子菜单>

< menuItem>

< text>常见问题< / text>

< MENU_ID> 17< / MENU_ID>

< PRNT_MENU_ID> 4< / PRNT_MENU_ID>

< / menuItem>

< menuItem>

< ;文字>操作方法< / text>

< MENU_ID> 18< / MENU_ID>

< PRNT_MENU_ID> 4< / PRNT_MENU_ID>

< / menuItem>

< / submenu>

< / menuItem>

< / menu>


谢谢&此致,

Neeraj

Hi,

I am having an XML document(input.xml) which is showing the menu heirarchy
used in my application.My requirement is to add "submenu" tag to those
menuitems who are having the child menuitems as shown in output.xml.
I am using VB.NET framework 1.1.

Please Help, i have already invested my 2 days but unable to build the logic
as input xml may be having any level of nesting of menuitems.

input.xml
***************************************
<menu>
<menuItem>
<text>HOME</text>
<javascriptcommand>opennewwindow(''home.aspx'')</javascriptcommand>
<cssclass>off</cssclass>
<MENU_ID>1</MENU_ID>
</menuItem>
<menuItem>
<text>QUERY</text>
<javascriptcommand>openPopup(''fundSearch.aspx'',''Se arch'', 580,
200)</javascriptcommand>
<cssclass>off</cssclass>
<MENU_ID>2</MENU_ID>
</menuItem>
<menuItem>
<text>REPORTS</text>
<cssclass>off</cssclass>
<MENU_ID>3</MENU_ID>
<menuItem>
<text>Standard Reports</text>
<MENU_ID>5</MENU_ID>
<PRNT_MENU_ID>3</PRNT_MENU_ID>
<menuItem>
<text>PM Tenure</text>
<MENU_ID>7</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Performance</text>
<MENU_ID>8</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fee & Expenses</text>
<MENU_ID>9</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fact Sheet PDFs</text>
<MENU_ID>10</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fund Facts</text>
<MENU_ID>11</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
</menuItem>
<menuItem>
<text>Custom Reports</text>
<MENU_ID>6</MENU_ID>
<PRNT_MENU_ID>3</PRNT_MENU_ID>
<menuItem>
<text>Spectrums</text>
<MENU_ID>12</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Performance</text>
<MENU_ID>13</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Descriptions</text>
<MENU_ID>14</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fund Actions</text>
<MENU_ID>15</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Inv Svcs Only</text>
<MENU_ID>16</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
</menuItem>
</menuItem>
<menuItem>
<text>HELP</text>
<cssclass>off</cssclass>
<MENU_ID>4</MENU_ID>
<menuItem>
<text>FAQs</text>
<MENU_ID>17</MENU_ID>
<PRNT_MENU_ID>4</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>How To</text>
<MENU_ID>18</MENU_ID>
<PRNT_MENU_ID>4</PRNT_MENU_ID>
</menuItem>
</menuItem>
</menu>

output.xml
************************************************** ***
<menu>
<menuItem>
<text>HOME</text>
<javascriptcommand>opennewwindow(''home.aspx'')</javascriptcommand>
<cssclass>off</cssclass>
<MENU_ID>1</MENU_ID>
</menuItem>
<menuItem>
<text>QUERY</text>
<javascriptcommand>openPopup(''fundSearch.aspx'',''Se arch'', 580,
200)</javascriptcommand>
<cssclass>off</cssclass>
<MENU_ID>2</MENU_ID>
</menuItem>
<menuItem>
<text>REPORTS</text>
<cssclass>off</cssclass>
<MENU_ID>3</MENU_ID>
<submenu>
<menuItem>
<text>Standard Reports</text>
<MENU_ID>5</MENU_ID>
<PRNT_MENU_ID>3</PRNT_MENU_ID>
<submenu>
<menuItem>
<text>PM Tenure</text>
<MENU_ID>7</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Performance</text>
<MENU_ID>8</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fee & Expenses</text>
<MENU_ID>9</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fact Sheet PDFs</text>
<MENU_ID>10</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fund Facts</text>
<MENU_ID>11</MENU_ID>
<PRNT_MENU_ID>5</PRNT_MENU_ID>
</menuItem>
</submenu>
</menuItem>
<menuItem>
<text>Custom Reports</text>
<MENU_ID>6</MENU_ID>
<PRNT_MENU_ID>3</PRNT_MENU_ID>
<submenu>
<menuItem>
<text>Spectrums</text>
<MENU_ID>12</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Performance</text>
<MENU_ID>13</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Descriptions</text>
<MENU_ID>14</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Fund Actions</text>
<MENU_ID>15</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>Inv Svcs Only</text>
<MENU_ID>16</MENU_ID>
<PRNT_MENU_ID>6</PRNT_MENU_ID>
</menuItem>
</submenu>
</menuItem>
</submenu>
</menuItem>
<menuItem>
<text>HELP</text>
<cssclass>off</cssclass>
<MENU_ID>4</MENU_ID>
<submenu>
<menuItem>
<text>FAQs</text>
<MENU_ID>17</MENU_ID>
<PRNT_MENU_ID>4</PRNT_MENU_ID>
</menuItem>
<menuItem>
<text>How To</text>
<MENU_ID>18</MENU_ID>
<PRNT_MENU_ID>4</PRNT_MENU_ID>
</menuItem>
</submenu>
</menuItem>
</menu>

Thanks & Regards,
Neeraj

推荐答案




我是不确定我是否理解正确,但我认为你需要插入

a< subMenu>每个嵌套< menuItem>之前的元素元件。在其他

字中,你想转换input.xml使它看起来像output.xml

???


是这样吗 ?如果是这样的话,你能用什么逻辑发布

到现在为止?


问候,


Cerebrus。

Hi,

I''m not sure I understand you correctly, but I think you need to insert
a <subMenu> element before each nested <menuItem> element. In other
words, you want to convert input.xml so that it looks like output.xml
???

Is that so ? If so, could you post whatever logic you have come up with
till now ?

Regards,

Cerebrus.


我在找到一个Xpath Expression来挑选相关的

节点时遇到了麻烦


例如

descendant :: menuItem [parent :: menuItem] [not(preceding-sibling :: menuItem)]


Cerebus - 我希望看到在

节点列表中获得相关节点后,在

相关menuItem节点周围插入一个新的父节点


ie


xdoc.Load(" xpath.xml")

Dim nl As XmlNodeList = xdoc.DocumentElement。 _

SelectNodes(&descendant :: menuItem [parent :: menuItem] [not(preceding-sibling :: menuItem)]")


For每个xnode In nl


txEle = xdoc.CreateElement(" submenu")

txEle.AppendChild(xnode)


''现在我们如何更新xdoc

''用txEle替换xnode

''因为在代码的这一点上我们不知道我们在哪里

在xdoc

下一页

Dickster

I''m having trouble getting an Xpath Expression to pick out the relevant
nodes

e.g.
descendant::menuItem[parent::menuItem][not(preceding-sibling::menuItem)]

Cerebus - I Would like to see to insert a new parent node around the
relevant menuItem node after having got the relevant nodes in a
nodelist

i.e.

xdoc.Load("xpath.xml")

Dim nl As XmlNodeList = xdoc.DocumentElement. _
SelectNodes("descendant::menuItem[parent::menuItem][not(preceding-sibling::menuItem)]")

For Each xnode In nl

txEle = xdoc.CreateElement("submenu")
txEle.AppendChild(xnode)

''Now how do we update xdoc
''replacing xnode with txEle
'' because at this point in code we dont know where we
are in xdoc
Next
Dickster


Hi Dickster,

您的问题是否是Neeraj问题的答案?或者你的问题

与Neeraj的原始问题分开?


我想解决Neeraj问题的方式是:(xDoc是

XmlDocument)


1.获取包含所有顶级menuItem的NodeList节点,使用

xDoc.SelectNodes(" / menu / menuItem")

2.遍历此列表,调用方法,说ParseChildren()

3. ParseChildren方法将递归处理每个孩子

" menuItem"节点,使用SelectSingleNode(.// menuItem)

4.在处理过程中,它创建一个XmlDocumentFragment,其中包含所有

的menuItem的OuterXml。节点。

5.然后创建一个subMenu节点。就在此之前的元素menuItem

节点。然后将XmlDocumentFragment作为子项附加到此

" subMenu"元素。

6.原始的menuItem然后删除节点。

7.循环移动到下一个兄弟节点menuItem。节点,如果没有兄弟姐妹

存在,它会移动到父母的下一个兄弟。


我有一些代码可以工作(继续步骤6),但我仍然坚持在兄弟姐妹的迭代中获得
。希望我能找到一些时间来很快调试我的代码。


你提出的XPath表达式只选择第一个嵌套的

" menuItem"元素,因为你已经添加了

而不是(previous-sibling :: menuItem)部分。


HTH,


问候,


Cerebrus。

Hi Dickster,

Is your question an answer to Neeraj''s question ? Or is your question
separate from Neeraj''s original question ?

The way I was thinking of solving Neeraj''s problem was : (xDoc is the
XmlDocument)

1. Get a NodeList containing all Top level "menuItem" nodes, using
xDoc.SelectNodes("/menu/menuItem")
2. Iterate through this list, calling a method, say "ParseChildren()"
3. The ParseChildren method will recursively process each child
"menuItem" node, using SelectSingleNode(".//menuItem")
4. During processing, it creates an XmlDocumentFragment containing all
the OuterXml of the "menuItem" node.
5. It then creates a "subMenu" element just before this "menuItem"
node. Then the XmlDocumentFragment is appended as a child to this
"subMenu" element.
6. The original "menuItem" node is then deleted.
7. The loop moves on to the next sibling "menuItem" node, if no sibling
exists, it moves to the parent''s next sibling.

I''ve got some of the code to work (uptill step 6), but I''m still stuck
at iterating through the siblings. Hopefully I''ll find some time to
debug my code soon.

The XPath expression you presented selects only the first nested
"menuItem" element, since you have added the
not(preceding-sibling::menuItem) part.

HTH,

Regards,

Cerebrus.


这篇关于如何在Vb.NET中添加父节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆