2014-02-03 6 views
1

Я хочу добавить новый узел в уже существующий XML. Моя структура XML выглядит следующим образом: -Добавить новый узел в уже существующий XML-документ

<NewDataSet> 
    <Table> 
    <HotelName>A</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>B</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>-</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    </Table> 
    <Table> 
    <HotelName>B</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>A</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>Bh</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    </Table> 
<NewDataSet> 

Я хочу, чтобы добавить узел после тега т.е. я хочу, чтобы мой XML, как

<NewDataSet> 
    <Table> 
    <HotelName>A</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <Address>Lodhi Road</Address> 
    <HBeds>B</HBeds> 
    <Soh>-</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    <HId>1</HId> 
    </Table> 
    <Table> 
    <HotelName>B</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <Address>Lodhi Road</Address> 
    <HBeds>A</HBeds> 
    <Soh>Bh</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    <HId>2</HId> 
    </Table> 
<NewDataSet> 

я получаю значение газоразрядных из базы данных, используя следующий код.

Dim XmlNodeListPackes As XmlNodeList 
XmlNodeListPackes = xDoc.SelectNodes("/NewDataSet/Table") 
For Each xNode As XmlNode In XmlNodeListPackes 

       Dim strHotelBeds As String = xNode.SelectSingleNode("Hbeds").InnerText 
       Dim City As String = txtxmlfile.Text 
       HId = DAL.GetHotelBedId(strHotelBeds, City) 

      Next 

Я хочу вставить этот HId в XML. Пожалуйста, помогите мне с кодом.

Благодаря

ответ

1

Несколько вещей, которые вы должны знать:

  1. XML-закрывающий тег отсутствует /.

  2. Xml чувствителен к регистру.<HBeds> и <Hbeds> разные!

Вот пример того, как мы можем вставить узлы, как было задано в вопросе.

В моем проекте у меня есть файл XML, "MyXml.xml":

<?xml version="1.0" encoding="utf-8" ?> 
<NewDataSet> 
    <Table> 
    <HotelName>A</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>B</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>-</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    </Table> 
    <Table> 
    <HotelName>B</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>A</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>Bh</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    </Table> 
</NewDataSet> 

У меня есть тест веб-форму WebForm1.aspx с этой разметкой:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="VBXmlTest.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:TextBox ID="txtxmlfile" runat="server">Vancouver</asp:TextBox> 
    </div> 
    </form> 
</body> 
</html> 

В коде позади, в Page_Load Я звоню функции, Мой WebForm1.aspx.vb is:

Imports System.Xml 

Public Class WebForm1 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     ProcessXml() 
    End Sub 

    Private Sub ProcessXml() 
     Dim xDoc As New XmlDocument 
     Dim filePath As String = Server.MapPath("~/MyXml.xml") 
     xDoc.Load(filePath) 
     Dim XmlNodeListPackes As XmlNodeList 
     XmlNodeListPackes = xDoc.SelectNodes("/NewDataSet/Table") 
     Dim Hid As Integer 
     For Each xNode As XmlNode In XmlNodeListPackes 

      Dim strHotelBeds As String = xNode.SelectSingleNode("HBeds").InnerText 
      Dim City As String = txtxmlfile.Text 
      Hid = DAL.GetHotelBedId(strHotelBeds, City) 
      Dim hidNode As XmlNode = xNode.SelectSingleNode("HId") 
      If hidNode IsNot Nothing Then 
       hidNode.InnerText = Hid 
      Else 
       hidNode = xDoc.CreateNode(XmlNodeType.Element, "HId", "") 
       hidNode.InnerText = Hid 
       xNode.AppendChild(hidNode) 
      End If 
     Next 
     xDoc.Save(filePath) 
    End Sub 

End Class 

И испытать, я заменил DAL с модулем, только для тестирования:

Public Module DAL 
    Public Function GetHotelBedId(ByVal strHotelBeds As String, ByVal City As String) As Integer 
     Return 1 
    End Function 
End Module 

И это не выход XML, независимо от того, сколько раз я его запускаю:

<?xml version="1.0" encoding="utf-8"?> 
<NewDataSet> 
    <Table> 
    <HotelName>A</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>B</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>-</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    <HId>1</HId> 
    </Table> 
    <Table> 
    <HotelName>B</HotelName> 
    <Rating>5*</Rating> 
    <Hzone>Central </Hzone> 
    <HBeds>A</HBeds> 
    <Address>Lodhi Road</Address> 
    <Soh>Bh</Soh> 
    <Recommended>0</Recommended> 
    <DetailStr>-</DetailStr> 
    <Block>N</Block> 
    <HId>1</HId> 
    </Table> 
</NewDataSet> 
1

Сразу после получения значения Híd сделать это:

Dim xHIdNode = xNode.SelectSingleNode("HId") 

If xHIdNode Is Nothing 
    xHIdNode = xDoc.CreateNode(XmlNodeType.Element, "HId", Nothing) 
    xNode.AppendChild(xNewNode) 
End If 

xHIdNode.Value = HId 

Это должно сделать работу.

+0

Ошибка отображения: Истекло время ожидания. Период ожидания истекает до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут. –

+0

Я полагаю, что это исключение исходит из вашего DAL? Конечно, если он устанавливает новое соединение для каждого вызова GetHotelBedId, вы, скорее всего, не должны его вызывать в цикле for. Я предлагаю вам сначала пройти через ваш XML-документ, чтобы собрать данные Hbeds, а затем построить с ним запрос DAL для извлечения HId в одной операции db, а THEN использовать результаты для заполнения вашего документа. – Crono

+0

Да, он исходит из DAL. Тогда где я должен использовать «GetHotelBedId».Каждый раз, когда он открывает новое соединение. –

Смежные вопросы