带属性的XML节点 序列化为CDATA格式

qxyywy 2020-01-14 03:07:56
<fulltext-file>
<jats:object-id pub-id-type="roid">RO201909193412970ZX.pdf</jats:object-id>
<jats:object-id pub-id-type="uri"><![CDATA[https://ttu-ir.tdl.org/handle/2346/84945]]></jats:object-id>
<jats:object-id pub-id-type="download_uri"><![CDATA[https://ttu-ir.tdl.org/bitstream/handle/2346/84945/1/ICES-2019-178.pdf?sequence=1&isAllowed=y]]></jats:object-id>
</fulltext-file>

XML样例如上。
最近在处理一个NSTL标准相关的项目遇到需要把相关的元数据处理为NSTL标准化XML 其中的XML节点里有带属性的CDATA格式节点,始终未找到快捷的处理方式。
在处理不带属性的XML节点CDATA格式的时候 我这边采用了自定义一个CData类型:
public class CData : IXmlSerializable
{
private string m_Value;

public CData()
{
}

public CData(string p_Value)
{
m_Value = p_Value;
}

public string Value
{
get
{
return m_Value;
}
}

public void ReadXml(XmlReader reader)
{
m_Value = reader.ReadElementContentAsString();
}

public void WriteXml(XmlWriter writer)
{
writer.WriteCData(m_Value);
}

public XmlSchema GetSchema()
{
return (null);
}

public override string ToString()
{
return m_Value;
}

public static implicit operator string(CData element)
{
return (element == null) ? null : element.m_Value;
}

public static implicit operator CData(string text)
{
return new CData(text);
}

}


在实际应用的时候相关节点定义对象如下:
public class FullText
{
[XmlElement("object-id", Namespace = "http://jats.nlm.nih.gov/archiving/1.1/xsd")]
public CData object_id { get; set; }
}


调用代码:
res.record.fulltext_file.object_id = "abc123";

序列化为XML:
 <fulltext-file>
<jats:object-id><![CDATA[abc123]]></jats:object-id>
</fulltext-file>


但这种方式只能处理不带属性的XML节点,如最上面带属性的xml节点,
想请教下各位是否有快捷的方式定义相关的object-id对象,并序列化。
如:
<fulltext-file>
<jats:object-id pub-id-type="roid">RO201909193412970ZX.pdf</jats:object-id>
<jats:object-id pub-id-type="uri"><![CDATA[https://ttu-ir.tdl.org/handle/2346/84945]]></jats:object-id>
<jats:object-id pub-id-type="download_uri"><![CDATA[https://ttu-ir.tdl.org/bitstream/handle/2346/84945/1/ICES-2019-178.pdf?sequence=1&isAllowed=y]]></jats:object-id>
</fulltext-file>
...全文
307 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
github_36000833 2020-01-14
  • 打赏
  • 举报
回复
你传一个Dictionary不也可以? private Dictionary<string,string> m_attributes;
qxyywy 2020-01-14
  • 打赏
  • 举报
回复
引用 2 楼 github_36000833 的回复:
class CData 不是已经自定义了 IXmlSerializable? public class CData : IXmlSerializable { private string m_Value; private string m_idType; public void ReadXml(XmlReader reader) { m_idType = reader.GetAttribute("pub-id-type"); m_Value = reader.ReadElementContentAsString(); } public void WriteXml(XmlWriter writer) { writer.WriteAttributeString("pub-id-type", m_idType); writer.WriteCData(m_Value); } ... }
类型 pub-id-type 这个是未知的 上面只是举例
github_36000833 2020-01-14
  • 打赏
  • 举报
回复
class CData 不是已经自定义了 IXmlSerializable? public class CData : IXmlSerializable { private string m_Value; private string m_idType; public void ReadXml(XmlReader reader) { m_idType = reader.GetAttribute("pub-id-type"); m_Value = reader.ReadElementContentAsString(); } public void WriteXml(XmlWriter writer) { writer.WriteAttributeString("pub-id-type", m_idType); writer.WriteCData(m_Value); } ... }
qxyywy 2020-01-14
  • 打赏
  • 举报
回复
上面自定义的CData类型不能作为XMLText的基础类型,如类型定义为:
public class object_ID
    {
        [XmlElement("pub-id-type")]
        public string pub_id_type { get; set; }

        [XmlText]
        public CData value { get; set; }

        public object_ID() { }

        public object_ID(string type, string value)
        {
            this.pub_id_type = type;
            this.value = value;
        }
    }
最终在序列化的时候 value出会提示CData类型的value序列化失败

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧