【问题标题】:How to get innertext from xml node that has '\' along with other characters when fetched as string以字符串形式获取时如何从具有“\”以及其他字符的xml节点获取内部文本
【发布时间】:2014-04-30 01:17:54
【问题描述】:

您好,我在从我的 oracle 数据库中保存为 varchar2 的 xml 脚本中提取内部文本时遇到问题。 在获取时,我得到了以下格式的 xml:

    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SpecificAction xmlns=\"http://www.xyz.com/schemas/core/caut\">action to take</SpecificAction>"

使用以下代码获取以下 xml:

    instance.cautDescription = records.GetStringOrDefault("SPEC_ACTION");

字段 SPEC_ACTION 是 VARCHAR2(4000 BYTE) 类型。

由于数据库中的 xml 中存在 \ 字符,我无法提取带有标签的内部文本。我尝试了以下代码来获取内部文本:

    string s = instance.cautDescription;
    XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(s);

            XmlNode specificAction = xmlDoc.DocumentElement.SelectSingleNode("/SpecificAction");
            string specific = specificAction.InnerText;
            xmlString = specificAction.InnerText;

            return xmlString;

我的代码返回 null 是否可以避免,如果可以,任何支持都会非常有帮助。

【问题讨论】:

  • 这是因为命名空间(xmlns)。您需要使用 XmlNamespaceManager。

标签: c# xml oracle


【解决方案1】:

这是使用具有默认命名空间的 XML 时的经典问题。在 XML 中,当您有默认命名空间(没有前缀的命名空间,如 xmlns="....")时,默认命名空间中会考虑所有没有前缀的元素。但是在 XPath 中,所有不考虑前缀的元素都没有命名空间。为了桥接这种不同的范例,您需要声明一个指向默认命名空间 URI 的前缀并在 XPath 中使用它:

var nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
nsManager.AddNamespace("ns", xmlDoc.DocumentElement.NamespaceURI);
XmlNode specificAction = xmlDoc.DocumentElement.SelectSingleNode("/ns:SpecificAction", nsManager);
string specific = specificAction.InnerText;

【讨论】:

  • 如何从更多子标签中获取?
  • 这是一个模糊不清的问题,可能会导致对 XPath 或 LINQ-to-XML 的详细解释。你应该更具体。无论如何,应该在不同的帖子中提出不同的问题,而不是在评论中。
  • &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;annotation:Text xmlns:annotation=\"http://www.xyz.com/schemas/core/annotation\"&gt;Road not taken&lt;/annotation:Text&gt;这种类型的xml又可以使用上述方法。
【解决方案2】:

由于“SpecificAction”节点有一个命名空间,您需要提供一个命名空间管理器。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(s);

XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable);
ns.AddNamespace("xyz", "http://www.xyz.com/schemas/core/caut");
XmlNode specificAction = xmlDoc.SelectSingleNode("/xyz:SpecificAction", ns);

return specificAction.InnerText;

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 2011-05-20
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2017-02-15
    相关资源
    最近更新 更多