CLR Procedure with XML parameter returns Data at the root level is invalid. Line 1, position 1
The problem is that you made a bad assumption about what value is returned by the SqlXml.ToString() method, and then in testing in Visual Studio, you injected a value but did not check to see what ToString() was actually returning (which is: "System.Data.SqlTypes.SqlXml"). Though you probably would have seen this had you placed the SqlContext.Pipe.Send(inputXml); line above the xmlDoc.LoadXml(inputXml); line ;-).

When working with the Sql* types, you want to almost always access them via the Value property, which they all have. The Value property does return the string version of the XML as you were wanting to get. However, this is less than ideal since you will be converted the XML to a string, only to convert that back to XML again when you call XmlDocument.LoadXml().

A better way is to use the SqlXml.CreateReader() method which returns an XmlReader, and that can be used with the XmlDocument.Load() method.

I reworked your test code (below) to be an example showing all 3 of these variations:

using System.Data.SqlTypes;
using System.Xml;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure()]
    public static int spGetTaxOfficeXML(SqlXml InputXml)
    {
        // this procedure rename Row elements name with NodeName attribute value
        XmlDocument _XmlDoc = new XmlDocument();
        _XmlDoc.Load(InputXml.CreateReader());

        // procedure Logic

        SqlContext.Pipe.Send("Incorrect:\n" + InputXml.ToString());

        SqlContext.Pipe.Send("\nBetter, but not an XmlDocument:\n" + InputXml.Value);

        SqlContext.Pipe.Send("\nCorrect:\n" + _XmlDoc.OuterXml);

        return 0;
    }
}


Running the code above with the original test SQL returns the following in the "Messages" tab:

Incorrect:
System.Data.SqlTypes.SqlXml

Better, but not an XmlDocument:
&lt;NodeA&gt;&lt;NodeB /&gt;&lt;NodeC AttributeX=""&gt;&lt;Row NodeName="RowA" AttributeA="" AttributeB="abcd" AttributeC="efgh" /&gt;&lt;Row NodeName="RowB" AttributeA="wxyz" /&gt;&lt;Row NodeName="RowC" AttributeB="qwer" AttributeC="tyui" /&gt;&lt;Row NodeName="RowD" AttributeA="stuv" AttributeB="erty" AttributeC="fghj" /&gt;&lt;/NodeC&gt;&lt;/NodeA&gt;

Correct:
&lt;NodeA&gt;&lt;NodeB /&gt;&lt;NodeC AttributeX=""&gt;&lt;Row NodeName="RowA" AttributeA="" AttributeB="abcd" AttributeC="efgh" /&gt;&lt;Row NodeName="RowB" AttributeA="wxyz" /&gt;&lt;Row NodeName="RowC" AttributeB="qwer" AttributeC="tyui" /&gt;&lt;Row NodeName="RowD" AttributeA="stuv" AttributeB="erty" AttributeC="fghj" /&gt;&lt;/NodeC&gt;&lt;/NodeA&gt;


P.S.  You don't need to worry about UTF-8, especially for NCHAR / NVARCHAR / XML data generated from within SQL Server, since SQL Server is UTF-16 LE.