创建自定义biztalk管道组件以将HTML转换为XML?

创建自定义biztalk管道组件以将HTML转换为XML?,biztalk,biztalk2006r2,Biztalk,Biztalk2006r2,我正在使用BizTalk server 2006R2和Visual Studio 2005, 在我的应用程序中,我有一个html,它必须在定制的管道组件中转换为XML 我正在传递这样的html <HTML><Customer><Data><Name>Udaya</Name><Age>18</Age><Nation>India</Nation></Data></Custom

我正在使用BizTalk server 2006R2和Visual Studio 2005, 在我的应用程序中,我有一个html,它必须在定制的管道组件中转换为XML 我正在传递这样的html

<HTML><Customer><Data><Name>Udaya</Name><Age>18</Age><Nation>India</Nation></Data></Customer></HTML>
我必须得到一个像这样的XML

<ns0:Customer xmlns:ns0="http://CWW.com">
    <Data>
        <Name>Udaya</Name>
        <Age>18</Age>
        <Nation>India</Nation>
    </Data>
</ns0:Customer>
有人能给我一些建议吗?有没有其他方法不使用定制的管道也可以这样做

我正在尝试下面的管道组件,但它不起作用

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
using System.ComponentModel;
using Microsoft.BizTalk.Component.Interop;
using Microsoft.BizTalk.Message.Interop;
//using System.Windows.Forms;
using System.CodeDom;
using HtmlAgilityPack;
namespace MessageBatchPipelineCompoent
{

[ComponentCategory(CategoryTypes.CATID_PipelineComponent)]

[ComponentCategory(CategoryTypes.CATID_DisassemblingParser)]

[System.Runtime.InteropServices.Guid("6118B8F0-8684-4ba2-87B4-8336D70BD4F7")]

public class DisassemblePipeline : IBaseComponent,

IDisassemblerComponent,

IComponentUI,

IPersistPropertyBag
{

    //Used to hold disassembled messages

    private System.Collections.Queue qOutputMsgs = new System.Collections.Queue();

    private string systemPropertiesNamespace = @"http://schemas.microsoft.com/BizTalk/2003/system-properties";

    /// <summary>

    /// Batch size used to batch records

    /// </summary>

    private int _BatchSize;

    public int BatchSize
    {

        get { return _BatchSize; }

        set { _BatchSize = value; }

    }

    /// <summary>

    /// Default constructor

    /// </summary>

    public DisassemblePipeline()
    {

    }

    /// <summary>

    /// Description of pipeline

    /// </summary>

    public string Description
    {

        get
        {

            return "Component to convert HTML to XML";

        }

    }

    /// <summary>

    /// Name of pipeline

    /// </summary>

    public string Name
    {

        get
        {

            return "HTMLToXMLComponent";

        }

    }

    /// <summary>

    /// Pipeline version

    /// </summary>

    public string Version
    {

        get
        {

            return "1.0.0.0";

        }

    }



    /// <summary>

    /// Returns collecton of errors

    /// </summary>

    public System.Collections.IEnumerator Validate(object projectSystem)
    {

        return null;

    }

    /// <summary>

    /// Returns icon of pipeline

    /// </summary>

    public System.IntPtr Icon
    {

        get
        {

            return new System.IntPtr();

        }

    }



    /// <summary>

    /// Class GUID

    /// </summary>

    public void GetClassID(out Guid classID)
    {

        classID = new Guid("ACC3F15A-C389-4a5d-8F8E-2A951CDC4C19");

    }

    /// <summary>

    /// InitNew

    /// </summary>

    public void InitNew()
    {

    }

    /// <summary>

    /// Load property from property bag

    /// </summary>

    public void Load(IPropertyBag propertyBag, int errorLog)
    {

        object val = null;

        try
        {

            propertyBag.Read("BatchSize", out val, 0);

        }
        catch (ArgumentException)
        {

        }
        catch (Exception ex)
        {
            throw new ApplicationException("Error reading PropertyBag: " + ex.Message);
        }
        if (val != null)

            _BatchSize = (int)val;

        else

            _BatchSize = 1;

    }

    /// <summary>

    /// Write property to property bag

    /// </summary>

    public void Save(IPropertyBag propertyBag, bool clearDirty, bool saveAllProperties)
    {

        object val = (object)BatchSize;

        propertyBag.Write("BatchSize", ref val);

    }

    /// <summary>

    /// Disassembles (breaks) message into small messages as per batch size

    /// </summary>

    public void Disassemble(IPipelineContext pContext, IBaseMessage pInMsg)
    {

        string originalDataString;

        try
        {

            //fetch original message

            Stream originalMessageStream = pInMsg.BodyPart.GetOriginalDataStream();

            byte[] bufferOriginalMessage = new byte[originalMessageStream.Length];

            originalMessageStream.Read(bufferOriginalMessage, 0, Convert.ToInt32(originalMessageStream.Length));

            originalDataString = System.Text.ASCIIEncoding.ASCII.GetString(bufferOriginalMessage);

        }

        catch (Exception ex)
        {

            throw new ApplicationException("Error in reading original message: " + ex.Message);

        }

       //XmlDocument originalMessageDoc = new XmlDocument();

        //HtmlDocument originalMessageDoc = new HtmlDocument();

        HtmlAgilityPack.HtmlDocument originalMessageDoc = new HtmlAgilityPack.HtmlDocument();

        originalMessageDoc.Load(originalDataString);

        StringBuilder messageString;

        try
        {

            //load original message

           // HtmlNode.

           // originalMessageDoc.GetElementsByTagName("HTML");

           //originalMessageDoc.DocumentElement.FirstChild.RemoveChild(originalMessageDoc.DocumentElement.FirstChild);

           // originalMessageDoc.DocumentElement.FirstChild.Attributes.Append("ns0");

           // String RootElement = originalMessageDoc.DocumentElement.Name;

            messageString = new StringBuilder();

            String RootNode = originalMessageDoc.DocumentNode.Name;

            System.Diagnostics.EventLog.WriteEntry("Hello", "What doing");

            //originalMessageDoc.DocumentNode.Attributes(RootNode,ns0);

            //messageString.Insert();

            messageString.Append(true);

           // messageString.Append("<" + RootNode + " xmlns:ns0='" + "http://SomeContent" + "'>");

            //messageString.Append("</" + "Sample" + ">");

            CreateOutgoingMessage(pContext, messageString.ToString(), "http://SomeContent", "Sample", pInMsg);

        }

        catch (Exception ex)
        {

            throw new ApplicationException("Error in writing outgoing messages: " + ex.Message);

        }

        finally
        {

            messageString = null;

            originalMessageDoc = null;

        }

    }

    /// <summary>

    /// Used to pass output messages`to next stage

    /// </summary>

    public IBaseMessage GetNext(IPipelineContext pContext)
    {

        if (qOutputMsgs.Count > 0)

            return (IBaseMessage)qOutputMsgs.Dequeue();

        else

            return null;

    }

    /// <summary>

    /// Queue outgoing messages

    /// </summary>

    private void CreateOutgoingMessage(IPipelineContext pContext, String messageString, string namespaceURI, string rootElement, IBaseMessage pInMsg)
    {

        IBaseMessage outMsg;

        try
        {

            //create outgoing message

            outMsg = pContext.GetMessageFactory().CreateMessage();

            outMsg.Context = pInMsg.Context;

            outMsg.AddPart("Body", pContext.GetMessageFactory().CreateMessagePart(), true);

            outMsg.Context.Promote("MessageType", systemPropertiesNamespace,"Sample");

           // outMsg.Context.Promote("MessageType", systemPropertiesNamespace, "http://SomeText" + "#" + rootElement.Replace("ns0:", ""));

            byte[] bufferOoutgoingMessage = System.Text.ASCIIEncoding.ASCII.GetBytes(messageString);

            outMsg.BodyPart.Data = new MemoryStream(bufferOoutgoingMessage);

            qOutputMsgs.Enqueue(outMsg);



        }

        catch (Exception ex)
        {

            throw new ApplicationException("Error in queueing outgoing messages: " + ex.Message);

        }

    }



   }

}
这是我创建的组件,但它不工作


现在我遇到了一个类似路径中非法字符的错误。

以前我使用的是originalMessageDoc.LoadoriginalDataString; 在disassembly函数中,我得到了路径错误中的非法字符,现在我已经解决了这个问题,用buy替换它

originalMessageDoc.LoadHTML(originalDataString);
现在我可以在事件日志中看到我创建了xml,但仍然有一个小错误 什么时候 字符串RootNode=originalMessageDoc.DocumentNode.Name

以前我是这样给的,现在我做得很认真
现在它说rootnode没有声明

之前我使用的是originalMessageDoc.LoadoriginalDataString; 在disassembly函数中,我得到了路径错误中的非法字符,现在我已经解决了这个问题,用buy替换它

originalMessageDoc.LoadHTML(originalDataString);
现在我可以在事件日志中看到我创建了xml,但仍然有一个小错误 什么时候 字符串RootNode=originalMessageDoc.DocumentNode.Name

以前我是这样给的,现在我做得很认真 现在它说rootnode没有声明