Как я использую XmlSerializer для вставки строки xml

Хотя вы не можете создавать потоки, у вас есть некоторая степень контроля над процессами в php. Здесь полезны два набора функций:

Функции управления процессом http://www.php.net/manual/en/ref.pcntl.php

Функции POSIX http://www.php.net/manual/en/ref.posix.php

Вы можете форкнуть ваш процесс с помощью pcntl_fork - возвращая PID ребенка. Затем вы можете использовать posix_kill для удаления этого PID.

Тем не менее, если вы убьете родительский процесс, то должен быть отправлен сигнал дочернему процессу, говорящий о его смерти. Если сам php не распознает это, вы можете зарегистрировать функцию для управления им и выполнить чистый выход с помощью pcntl_signal.

9
задан Hengyi 29 June 2009 в 23:12
поделиться

4 ответа

попробуйте следующее:

public class Root
{
    public string Name;
    public XDocument XmlString;
}

Root t = new Root 
         {  Name = "Test", 
            XmlString = XDocument.Parse("<Foo>bar</Foo>")
         };
1
ответ дан 4 December 2019 в 13:04
поделиться

Вы можете (ab) использовать для этого интерфейс IXmlSerializable и XmlWriter.WriteRaw . Но, как указал Гаретм, вам в значительной степени придется написать свой собственный код сериализации.

using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace ConsoleApplicationCSharp
{
  public class Root : IXmlSerializable
  {
    public string Name;
    public string XmlString;

    public Root() { }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
      writer.WriteElementString("Name", Name);
      writer.WriteStartElement("XmlString");
      writer.WriteRaw(XmlString);
      writer.WriteFullEndElement();
    }

    public void ReadXml(System.Xml.XmlReader reader) { /* ... */ }
    public XmlSchema GetSchema() { return (null); }
    public static void Main(string[] args)
    {
      Root t = new Root
      {
        Name = "Test",
        XmlString = "<Foo>bar</Foo>"
      };
      System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(Root));
      x.Serialize(Console.Out, t);
      return;
    }
  }
}

выводит

<?xml version="1.0" encoding="ibm850"?>
<Root>
  <Name>Test</Name>
  <XmlString><Foo>bar</Foo></XmlString>
</Root>
2
ответ дан 4 December 2019 в 13:04
поделиться

Вы можете ограничить настраиваемую сериализацию только тем элементом, который требует особого внимания, например.

public class Root
{
    public string Name;

    [XmlIgnore]
    public string XmlString
    {
        get
        {
            if (SerializedXmlString == null)
                return "";
            return SerializedXmlString.Value;
        }
        set
        {
            if (SerializedXmlString == null)
                SerializedXmlString = new RawString();
            SerializedXmlString.Value = value;
        }
    }

    [XmlElement("XmlString")]
    [Browsable(false)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public RawString SerializedXmlString;
}

public class RawString : IXmlSerializable
{
    public string Value { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        this.Value = reader.ReadInnerXml();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteRaw(this.Value);
    }
}
13
ответ дан 4 December 2019 в 13:04
поделиться

Я был бы очень удивлен, если бы это было возможно. Предположим, у вас есть возможность сделать это - что бы произошло, если бы вы неправильно сформировали XML в свойстве - все просто сломалось бы.

Я полагаю, что вам нужно будет либо написать собственную сериализацию для этого случая, либо сделать так, чтобы поле XmlString представляло собой структуру, содержащую поле foo.

0
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: