使用 node.innerXML 设置 XML 字符串 - 使用前缀会导致错误
Set XML string using node.innerXML - use of prefix causes error
我正在从 DB 创建一个巨大的 xml,它的大部分部分是硬编码的(预定义值),所以我决定使用 StringBuilder 创建字符串并将其分配给节点的 InnerXML 但使用了前缀因为其中一个属性不允许我设置说明 "Prefix not declared".
的字符串
XMLNode addr = DocumentElement.createElement("element","address",null);
addr.InnerXML = "<test><s1>ttt</s1><s2 xsi:type="test">yyy</s2></test>";
prefix xsi 导致此处出现错误。是否有任何解决方法。
xsi 似乎是一个命名空间。您将需要声明该命名空间或不使用它。不声明使用无效
有一些类似的问题,我发现解决此问题的唯一方法是 将所需的命名空间 添加到您的 InnserXml
:
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml("<Document xmlns=\"www.abc.com\" xmlns:xsi=\"w3.org/2001/XMLSchema-instance\"></Document>");
XmlNode t = xdoc.CreateElement("element", "t", null);
t.InnerXml = "<originalText xmlns:xsi=\"w3.org/2001/XMLSchema-instance\"><reference xsi:value=\"testVal\"/></originalText>";
xdoc.FirstChild.AppendChild(t);
解决方法是:
首先简单地创建 XMLDocument 并将没有命名空间和前缀的普通 innerXML 分配为
XmlDocument ccda_xDoc = new XmlDocument();
ccda_xDoc.LoadXml("<ClinicalDocument></ClinicalDocument>");
XmlElement root = ccda_xDoc.DocumentElement;
root.InnerXml = @" My XML String without Prefix for any namespace";
然后搜索要应用前缀的节点并添加带有前缀的属性:
XmlNode xsiValue = root.SelectSingleNode("encounter/code[@code='99201']");
XmlAttribute xsitype = structuredBody.CreateAttribute("sdtc", "valueSet", "urn:hl7-org:sdtc");
xsitype.Value = "2.16.840.1.113883.3.464.1003.101.12.1047";
xsiValue.Attributes.Prepend(xsitype);
最后将命名空间应用于根节点:
ccda_xDoc.DocumentElement.SetAttribute("xmlns", "urn:hl7-org:v3");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:voc", "urn:hl7-org:v3/voc");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:sdtc", "urn:hl7-org:sdtc");
我正在从 DB 创建一个巨大的 xml,它的大部分部分是硬编码的(预定义值),所以我决定使用 StringBuilder 创建字符串并将其分配给节点的 InnerXML 但使用了前缀因为其中一个属性不允许我设置说明 "Prefix not declared".
的字符串XMLNode addr = DocumentElement.createElement("element","address",null);
addr.InnerXML = "<test><s1>ttt</s1><s2 xsi:type="test">yyy</s2></test>";
prefix xsi 导致此处出现错误。是否有任何解决方法。
xsi 似乎是一个命名空间。您将需要声明该命名空间或不使用它。不声明使用无效
有一些类似的问题,我发现解决此问题的唯一方法是 将所需的命名空间 添加到您的 InnserXml
:
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml("<Document xmlns=\"www.abc.com\" xmlns:xsi=\"w3.org/2001/XMLSchema-instance\"></Document>");
XmlNode t = xdoc.CreateElement("element", "t", null);
t.InnerXml = "<originalText xmlns:xsi=\"w3.org/2001/XMLSchema-instance\"><reference xsi:value=\"testVal\"/></originalText>";
xdoc.FirstChild.AppendChild(t);
解决方法是:
首先简单地创建 XMLDocument 并将没有命名空间和前缀的普通 innerXML 分配为
XmlDocument ccda_xDoc = new XmlDocument();
ccda_xDoc.LoadXml("<ClinicalDocument></ClinicalDocument>");
XmlElement root = ccda_xDoc.DocumentElement;
root.InnerXml = @" My XML String without Prefix for any namespace";
然后搜索要应用前缀的节点并添加带有前缀的属性:
XmlNode xsiValue = root.SelectSingleNode("encounter/code[@code='99201']");
XmlAttribute xsitype = structuredBody.CreateAttribute("sdtc", "valueSet", "urn:hl7-org:sdtc");
xsitype.Value = "2.16.840.1.113883.3.464.1003.101.12.1047";
xsiValue.Attributes.Prepend(xsitype);
最后将命名空间应用于根节点:
ccda_xDoc.DocumentElement.SetAttribute("xmlns", "urn:hl7-org:v3");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:voc", "urn:hl7-org:v3/voc");
ccda_xDoc.DocumentElement.SetAttribute("xmlns:sdtc", "urn:hl7-org:sdtc");