Удалить узел из XmlSerializer - PullRequest
1 голос
/ 07 мая 2019

Я хочу сохранить запрос WCF как файл в каталог, но когда файл (xml) создается из XmlSerializer, он добавляет узел в файл XML, который мне не нужен.Вызывается ("ProjectInRequest").Я не хочу иметь этот узел в созданном выходном файле.Как я могу удалить его наиболее подходящим способом?

Я попытался загрузить весь документ в XmlDocument, где должен быть создан файл, но создание файла не происходит до тех пор, пока не будет получен ответ.Поэтому весь сервис не работает.

namespace SymbrioProjectIn
{

    public partial class SymbrioProjectIn_v1
    {
        public ProjectInResponse GetSymbrioProjectInRequest(ProjectInRequest request)
        {

            if (request == null || request.SymbrioXMLProjectIn.Project == null && request.SymbrioXMLProjectIn.Routing == null )
            {
                throw new ApplicationException("Request is null: You need to send info in request.");
            }
            else
            {
                try
                {
                    //All we want to do is take the Request that SAP sends and store it to a file catalog.
                    //We can after that use BizTalk to move the file too another sftp catalog for Symbrio
                    string path = AppDomain.CurrentDomain.BaseDirectory;
                    String dir = Path.GetDirectoryName(path);
                    dir += "\\ProjectIn_Data";
                    string filename = dir + "\\ProjectIn.xml";
                    if (!Directory.Exists(dir))
                        Directory.CreateDirectory(dir); // inside the if statement   

                    //XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    //Add an empty namespace and empty value
                    //ns.(string.Empty, string.Empty);
                    //XElement ProjectInRequest = new XElement("ProjectInRequest");
                    //ProjectInRequest.RemoveAll();

                    /*XmlAttributes ignore = new XmlAttributes() { XmlIgnore = true };
                    XmlAttributeOverrides overrides = new XmlAttributeOverrides();
                    overrides.Add(typeof(ProjectInRequest), "ProjectInRequest", ignore);*/

                    XmlSerializer ser = new XmlSerializer(request.GetType(), new XmlRootAttribute("ProjectInRequest").ElementName); //Tried som code from internet  not sure what it does               
                    FileStream fs = File.Open(
                            filename,
                            FileMode.OpenOrCreate,
                            FileAccess.Write,
                            FileShare.ReadWrite);
                    ser.Serialize(fs, request);                    
                    var response = new SymbrioProjectIn.ProjectInResponse{
                        SymbrioXMLProjectIn = request.SymbrioXMLProjectIn                        
                    };

                   //Looks like xmlSerialiser creates some type of namespace which I do not want.
                    //Create our own namespaces for the output
                    XmlDocument XDoc = new XmlDocument();
                    XDoc.Load(@"D:\ServiceArea\SymbrioProjectIn\ProjectIn_Data\ProjectIn.xml");
                    XmlNodeList RemoveNodeProjectInRequest = XDoc.GetElementsByTagName("ProjectInRequest");
                    foreach (XmlNode Node in RemoveNodeProjectInRequest)
                    {
                        Node.ParentNode.RemoveChild(Node);
                    }
                    XDoc.Save(@"D:\ServiceArea\SymbrioProjectIn\ProjectIn_Data\ProjectIn.xml"); 

                    return response;
                }
                catch (Exception ex)
                {
                    //throw new Exception(ex.Message);
                    throw new ApplicationException(ex.Message);

                } 
            }

        } 

    }
}

Файл, который создается, выглядит следующим образом

<?xml version="1.0"?>
<ProjectInRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="ProjectInRequest">
  <SymbrioXMLProjectIn>
    <Routing SourceValue="?" SourceType="?" DestinationValue="?" DestinationType="?" xmlns="http://www.symbrio.com/schemas/symbrioprojectin20133" />
    <Project xmlns="http://www.symbrio.com/schemas/symbrioprojectin20133">
      <CompanyCode>?</CompanyCode>
      <DivisionCode>?</DivisionCode>
      <MainProjectNo>?</MainProjectNo>
      <ProjectNo>?</ProjectNo>
      <ProjectName>?</ProjectName>
      <ProjectType>?</ProjectType>
      <PLCode>?</PLCode>
      <EmploymentNo>?</EmploymentNo>
      <Active>?</Active>
      <ActiveStart>?</ActiveStart>
      <ActiveEnd>?</ActiveEnd>
      <DeliveryAddress>?</DeliveryAddress>
      <DeliveryPostalCode>?</DeliveryPostalCode>
      <DeliveryCity>?</DeliveryCity>
      <DeliveryAddressNoteText>?</DeliveryAddressNoteText>
      <AccountRef1>?</AccountRef1>
      <AccountRef2>?</AccountRef2>
      <AccountRef3>?</AccountRef3>
      <AccountRef4>?</AccountRef4>
      <RegisteredDate>?</RegisteredDate>
      <Closed>?</Closed>
    </Project>
  </SymbrioXMLProjectIn>
</ProjectInRequest>

Что мне нужно, так это

<?xml version="1.0" encoding="utf-8"?>
<SymbrioXMLProjectIn>
  <Routing SourceValue="str1234" SourceType="str1234" DestinationValue="str1234" DestinationType="str1234" />
  <Project>
    <CompanyCode>str1234</CompanyCode>
    <DivisionCode>str1234</DivisionCode>
    <MainProjectNo>str1234</MainProjectNo>
    <ProjectNo>str1234</ProjectNo>
    <ProjectName>str1234</ProjectName>
    <ProjectType>str1234</ProjectType>
    <PLCode>str1234</PLCode>
    <EmploymentNo>str1234</EmploymentNo>
    <Active>str1234</Active>
    <ActiveStart>str1234</ActiveStart>
    <ActiveEnd>str1234</ActiveEnd>
    <DeliveryAddress>str1234</DeliveryAddress>
    <DeliveryPostalCode>str1234</DeliveryPostalCode>
    <DeliveryCity>str1234</DeliveryCity>
    <DeliveryAddressNoteText>str1234</DeliveryAddressNoteText>
    <AccountRef1>str1234</AccountRef1>
    <AccountRef2>str1234</AccountRef2>
    <AccountRef3>str1234</AccountRef3>
    <AccountRef4>str1234</AccountRef4>
    <RegisteredDate>str1234</RegisteredDate>
    <Closed>str1234</Closed>
  </Project>
</SymbrioXMLProjectIn>

ProjectInRequest - Узел не существует.

Я мог бы что-то пропустить, если да, пожалуйста, укажите это.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Nvm нашел решение, я XmlSeralized неправильно, правильный путь должен был быть

XmlSerializer ser = new XmlSerializer(request.SymbrioXMLProjectIn.GetType()); 

плохой путь был

 XmlSerializer ser = new XmlSerializer(request.GetType());

Оставим это здесь, если кто-то сделает фиктивную ошибку, напримеря.

0 голосов
/ 07 мая 2019

используйте xpath для извлечения нужной записи

//*[local-name()='SymbrioXMLProjectIn']
...