xmlns =“…”없이 객체를 XML로 직렬화하는 방법은 무엇입니까?
XML 네임 스페이스가 자동으로 직렬화되지 않고 .NET에서 개체를 직렬화하는 방법이 있습니까? 기본적으로 .NET은 XSI 및 XSD 네임 스페이스가 포함되어야한다고 생각하는 것 같습니다.
아 ... 신경 쓰지 마. 항상 질문이 제기 된 후 검색이 답을 얻습니다. 직렬화중인 내 개체 obj
는 이미 정의되어 있습니다. 하나의 빈 네임 스페이스가있는 XMLSerializerNamespace를 컬렉션에 추가하는 것이 트릭입니다.
VB에서는 다음과 같습니다.
Dim xs As New XmlSerializer(GetType(cEmploymentDetail))
Dim ns As New XmlSerializerNamespaces()
ns.Add("", "")
Dim settings As New XmlWriterSettings()
settings.OmitXmlDeclaration = True
Using ms As New MemoryStream(), _
sw As XmlWriter = XmlWriter.Create(ms, settings), _
sr As New StreamReader(ms)
xs.Serialize(sw, obj, ns)
ms.Position = 0
Console.WriteLine(sr.ReadToEnd())
End Using
다음과 같이 C #에서 :
//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);
//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns);
추가 및를 제거 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
하고 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
싶지만 여전히 자신의 네임 스페이스를 유지하려면 xmlns="http://schemas.YourCompany.com/YourSchema/"
이 간단한 변경 사항을 제외하고는 위와 동일한 코드를 사용합니다.
// Add lib namespace with empty prefix
ns.Add("", "http://schemas.YourCompany.com/YourSchema/");
네임 스페이스를 제거하려면 버전을 제거 할 수도 있습니다. 검색을 저장하기 위해 해당 기능을 추가 했으므로 아래 코드에서 두 가지를 모두 수행합니다.
또한 메모리에서 직렬화하기에는 너무 큰 매우 큰 xml 파일을 만들고 있으므로 일반 메서드로 래핑했습니다. 그래서 출력 파일을 세분화하고 더 작은 "덩어리"로 직렬화했습니다.
public static string XmlSerialize<T>(T entity) where T : class
{
// removes version
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
using (StringWriter sw = new StringWriter())
using (XmlWriter writer = XmlWriter.Create(sw, settings))
{
// removes namespace
var xmlns = new XmlSerializerNamespaces();
xmlns.Add(string.Empty, string.Empty);
xsSubmit.Serialize(writer, entity, xmlns);
return sw.ToString(); // Your XML
}
}
이 도우미 클래스를 제안합니다.
public static class Xml
{
#region Fields
private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true};
private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")});
#endregion
#region Methods
public static string Serialize(object obj)
{
if (obj == null)
{
return null;
}
return DoSerialize(obj);
}
private static string DoSerialize(object obj)
{
using (var ms = new MemoryStream())
using (var writer = XmlWriter.Create(ms, WriterSettings))
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj, Namespaces);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static T Deserialize<T>(string data)
where T : class
{
if (string.IsNullOrEmpty(data))
{
return null;
}
return DoDeserialize<T>(data);
}
private static T DoDeserialize<T>(string data) where T : class
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
var serializer = new XmlSerializer(typeof (T));
return (T) serializer.Deserialize(ms);
}
}
#endregion
}
:)
생성 된 클래스에서 xml로 직렬화 할 때 (예 : xsd.exe 가 사용 된 경우) 각 요소에 대한 추가 xmlns 속성을 제거 할 수없는 경우 다음과 같이됩니다.
<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />
그런 다음 나는 나를 위해 일한 것을 당신과 공유 할 것입니다 (이전 답변과 내가 여기서 찾은 것의 혼합 )
다음과 같이 모든 다른 xmlns를 명시 적으로 설정합니다.
Dim xmlns = New XmlSerializerNamespaces()
xmlns.Add("one", "urn:names:specification:schema:xsd:one")
xmlns.Add("two", "urn:names:specification:schema:xsd:two")
xmlns.Add("three", "urn:names:specification:schema:xsd:three")
그런 다음 직렬화에 전달하십시오.
serializer.Serialize(writer, object, xmlns);
you will have the three namespaces declared in the root element and no more needed to be generated in the other elements which will be prefixed accordingly
<root xmlns:one="urn:names:specification:schema:xsd:one" ... />
<one:Element />
<two:ElementFromAnotherNameSpace /> ...
참고URL : https://stackoverflow.com/questions/258960/how-to-serialize-an-object-to-xml-without-getting-xmlns
'code' 카테고리의 다른 글
메서드 선언은 PHP의 부모 메서드와 호환되어야합니다. (0) | 2020.08.19 |
---|---|
GIT에서 2 개의 분기를 병합 (0) | 2020.08.19 |
PHP의 '폭발'이란 무엇입니까? (0) | 2020.08.19 |
IntelliJ 분할 창 탐색 (0) | 2020.08.19 |
Parallel.ForEach는 활성 스레드 수를 제한합니까? (0) | 2020.08.19 |