gpt4 book ai didi

c# - 使用 C# 反序列化带有命名空间的 XML 片段

转载 作者:数据小太阳 更新时间:2023-10-29 02:08:11 25 4
gpt4 key购买 nike

我在反序列化以下 XML 片段(来自 OneNote)时遇到问题:

<one:OE creationTime="2015-03-21T18:32:38.000Z" lastModifiedTime="2015-03-21T18:32:38.000Z" objectID="{649CA68C-C596-4F89-9885-1553A953529E}{30}{B0}" alignment="left" quickStyleIndex="1" selected="partial">
<one:List>
<one:Bullet bullet="2" fontSize="11.0" />
</one:List>
<one:T><![CDATA[Bullet point one]]></one:T>
</one:OE>

以下代码用于反序列化上述片段。 OE 类具有以下属性:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34230")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/office/onenote/2013/onenote")]
[System.Xml.Serialization.XmlRootAttribute("OE", Namespace = "http://schemas.microsoft.com/office/onenote/2013/onenote", IsNullable = true)]
public partial class OE : EntityBase<OE>
{
...
}

反序列化片段的实际方法在基类 EntityBase 中:

public static T Deserialize(string xml)
{
System.IO.StringReader stringReader = null;
try
{
stringReader = new System.IO.StringReader(xml);
return ((T)(Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader))));
}
finally
{
if ((stringReader != null))
{
stringReader.Dispose();
}
}
}

反序列化方法调用如下:

var element = OE.Deserialize(xmlString);

其中变量 xmlString 是上面给出的 XML 片段。在调用 Deserialize 方法时,出现以下错误:

There is an error in XML document (1,2). ---> System.Xml.XmlException: 'one' is an undeclared prefix. Line 1, position 2.

我花了一些时间查看在 OE 类中声明命名空间的属性,但一切似乎都是正确的。谁能指出我犯的错误?

最佳答案

answermatrixanomaly 给出是正确的,但不幸的是,给出的 OneNote 命名空间不正确。我正在使用 OneNote 2013 而不是 2010。我用来反序列化问题中给出的相同 XML 片段的实际代码如下:

public static OE DeserializeFragment(string xmlFragment)
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(OE));
System.IO.StringReader stringReader = null;
try
{
stringReader = new System.IO.StringReader(xmlFragment);

NameTable nt = new NameTable();
XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
nsManager.AddNamespace("one", "http://schemas.microsoft.com/office/onenote/2013/onenote");
XmlParserContext context = new XmlParserContext(null, nsManager, null, XmlSpace.None);
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment;

return ((OE)(serializer.Deserialize(System.Xml.XmlReader.Create(stringReader, xmlReaderSettings, context))));
}
finally
{
if ((stringReader != null))
{
stringReader.Dispose();
}
}
}

关于c# - 使用 C# 反序列化带有命名空间的 XML 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29775419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com