Попытался найти другое исправление для этого, так как мне не нравилось делать поиск и замену в файле XML.
Итак, вот оно - работает на моей машине -
Сначала я сгенерировал классы logRecordType
и logRecordHeaderType
, используя xsd.exe .Обратите внимание, что мне нужно только разобрать элементы logRecordHeader
, поэтому здесь есть дополнительная работа.Но исправление в основном состоит в том, чтобы использовать FixupNameTable
, чтобы каждое вхождение пространства имен с конечной косой чертой заменялось на другое без него.
namespace DolbyService.Schemas
{
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public partial class logRecordType
{
public const string xmlns_lr = "http://www.smpte-ra.org/schemas/430-4/2008/LogRecord";
public const string xmlns_dcml = "http://www.smpte-ra.org/schemas/433/2008/dcmlTypes";
public static IEnumerable<logRecordHeaderType> Parse(Stream xmlfile)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.NameTable = new FixupNameTable();
using (var rdr = XmlReader.Create(xmlfile, settings))
{
var headerSerialize = new XmlSerializer(typeof(logRecordHeaderType));
while (rdr.ReadToFollowing(logRecordHeaderType.LogRecordHeader, logRecordType.xmlns_lr))
{
using (var subreader = rdr.ReadSubtree())
{
var ok = headerSerialize.CanDeserialize(subreader);
var logRecordHeader = headerSerialize.Deserialize(subreader);
yield return logRecordHeader as logRecordHeaderType;
}
}
}
}
}
internal class FixupNameTable : XmlNameTable
{
private NameTable _table = new NameTable();
public override string Add(string key)
{
key = ReplaceKey(key);
return _table.Add(key);
}
private static string ReplaceKey(string key)
{
if (key.StartsWith(logRecordType.xmlns_lr)) key = logRecordType.xmlns_lr;
if (key.StartsWith(logRecordType.xmlns_dcml)) key = logRecordType.xmlns_dcml;
return key;
}
public override string Add(char[] array, int offset, int length)
{
return _table.Add(array, offset, length);
}
public override string Get(string key)
{
key = ReplaceKey(key);
return _table.Get(key);
}
public override string Get(char[] array, int offset, int length)
{
return _table.Get(array, offset, length);
}
}
[XmlRoot(logRecordHeaderType.LogRecordHeader, Namespace = logRecordType.xmlns_lr, IsNullable = false)]
public partial class logRecordHeaderType
{
public const string LogRecordHeader = "LogRecordHeader";
private static XmlSerializer _ser = new XmlSerializer(typeof(logRecordHeaderType));
public static logRecordHeaderType Deserialize(XmlReader xmlReader)
{
return _ser.Deserialize(xmlReader) as logRecordHeaderType;
}
public static bool CanDeserialize(XmlReader xmlReader)
{
return _ser.CanDeserialize(xmlReader);
}
}
public class HeaderComparer : IEqualityComparer<logRecordHeaderType>
{
public bool Equals(logRecordHeaderType x, logRecordHeaderType y)
{
return x.EventID == y.EventID;
}
public int GetHashCode(logRecordHeaderType obj)
{
return obj.EventID.GetHashCode();
}
}
}