Как изменить пространство имен XML определенного элемента

У меня есть некоторый набор xml, созданный с помощью xmlserialization некоторых сообщений WCF. Теперь я хочу создать общий метод, в котором я укажу имя файла xml и префикс, например mailxml12. Затем в xml-файле те элементы, которые не имеют префикса пространства имен в своем имени, должны быть заменены на mailxml12:

Как исходный файл:

<DeliveryApptCreateRequest d2p1:ApptType="Pallet" d2p1:PickupOrDelivery="Delivery" d2p1:ShipperApptRequestID="4490660303D5" d2p1:SchedulerCRID="234234" xmlns:d2p1="http://idealliance.org/Specs/mailxml12.0a/mailxml_defs" xmlns="http://idealliance.org/Specs/mailxml12.0a/mailxml_tm">
<SubmittingParty d2p1:MailerID6="123446" d2p1:CRID="342343" d2p1:MaildatUserLicense="A123" />
<SubmittingSoftware d2p1:SoftwareName="asds" d2p1:Vendor="123" d2p1:Version="12" />
<SubmitterTrackingID>2CAD3F71B4405EB16392</SubmitterTrackingID>
<DestinationEntry>No</DestinationEntry>
<OneTimeAppt>
  <PreferredAppt>2012-06-29T09:00:00Z</PreferredAppt>
</OneTimeAppt>    
<TrailerInfo>
  <Trailer>
    <TrailerNumber>A</TrailerNumber>
    <TrailerLength>20ft</TrailerLength>
  </Trailer>
  <Carrier>
    <CarrierName>N/A</CarrierName>
    <URL>http://test.com</URL>
  </Carrier>
  <BillOfLadingNumber>N/A</BillOfLadingNumber>
</TrailerInfo>   
</DeliveryApptCreateRequest>

После желаемого метода он должен быть изменен на все имя элемента, которое не имеет префикса mailxml:. Например, DeliveryApptCreateRequestдолжно стать mailxml:DeliveryApptCreateRequest в то время как элемент типа d2p1:CompanyNameдолжен оставаться как есть.

Я пытался использовать следующий код

 private void RepalceFile(string xmlfile)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(xmlfile);
        var a = doc.CreateAttribute("xmlns:mailxml12tm");
        a.Value = "http://idealliance.org/Specs/mailxml12.0a/mailxml_tm";
        doc.DocumentElement.Attributes.Append(a);
        doc.DocumentElement.Prefix = "mailxml12tm";

        foreach (XmlNode item in doc.SelectNodes("//*"))
        {
            if (item.Prefix.Length == 0)
                item.Prefix = "mailxml12tm";
        }
        doc.Save(xmlfile);
    }

Единственная проблема заключается в том, что корневой элемент остается таким, какой он есть, в то время как все изменяется по мере необходимости

6
задан Kamran Shahid 21 June 2012 в 12:22
поделиться