【问题标题】:"The ':' character, hexadecimal value 0x3A, cannot be included in a name"“':' 字符,十六进制值 0x3A,不能包含在名称中”
【发布时间】:2011-08-27 07:55:59
【问题描述】:

我有一个可以读取一些 xml 文件的代码。我尝试了不同的方法来解决这个问题,但不能。我也尝试过这样的编码:

Namespace my = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30";                
XElement myEgitimBilgileri = XDocument.Load(@"C:\25036077.xml").Element("my:"+ "Egitim_Bilgileri"); 

但总是同样的错误。这是原文:

private void button2_Click(object sender, EventArgs e)
{                               
    XElement myEgitimBilgileri =    
    XDocument.Load(@"C:\25036077.xml").Element("my:Egitim_Bilgileri");

    if (myEgitimBilgileri != null)
    {
        foreach (XElement element in myEgitimBilgileri.Elements())
        {
            Console.WriteLine("Name: {0}\tValue: {1}", element.Name, element.Value.Trim());
        }
    }

    Console.Read();
}

这是我的 xml 文件的路径:

<my:Egitim_Bilgileri>
        <my:egitimler_sap>
            <my:sap_eduname></my:sap_eduname>
            <my:sap_edufaculty></my:sap_edufaculty>
            <my:sap_eduprofession></my:sap_eduprofession>
            <my:sap_diplomno></my:sap_diplomno>
            <my:sap_edulevel></my:sap_edulevel>
            <my:sap_edustartdate xsi:nil="true"></my:sap_edustartdate>
            <my:sap_eduenddate xsi:nil="true"></my:sap_eduenddate>
        </my:egitimler_sap>
    </my:Egitim_Bilgileri>

这是我的命名空间在 XML 中的路径

xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30"

xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-23T00:43:17"

【问题讨论】:

标签: c# xml linq-to-xml infopath


【解决方案1】:

代码Element("my:" + "Egitim_Bilgileri")Element("my:Egitim_Bilgileri") 相同,表示元素命名“my:Egitim_Bilgileri”在默认命名空间中(有一个implicit conversion from string to XName)。

但是,: 在元素名称中无效(在命名空间分隔之外),因此会导致运行时异常。

相反,代码应该是Element(my + "Egitim_Bilgileri"),其中myXNamespace 对象。 XNamespace 对象的+ 运算符,当给定一个字符串作为第二个操作数时,会产生一个XName 对象,然后可以与Element(XName) 方法一起使用。

例如:

XNamespace my = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30";
XDocument doc = XDocument.Load(@"C:\25036077.xml");
// The following variable/assignment can be omitted,
// it is to show the + operator of XNamespace and how it results in XName
XName nodeName = my + "Egitim_Bilgileri";
XElement myEgitimBilgileri = doc.Element(nodeName);

编码愉快...并为不得不处理 InfoPath 表示哀悼:)


在大多数情况下,我更喜欢使用 XPath。除其他外,它允许轻松选择嵌套节点,并避免像 node.Element(x).Element(y) 构造可能需要的每个级别“检查 null”。

using System.Xml.XPath; // for XPathSelectElement extension method
XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30")
// Note that there is no XName object. Instead the XPath string is parsed
// and namespace resolution happens via the XmlNamespaceManager
XElement myEgitimBilgileri = doc.XPathSelectElement("/my:myFields/my:Egitim_Bilgileri", ns);

【讨论】:

  • 您好,谢谢您,但现在程序看不到我需要的元素。我的意思是如果 (myEgitimBilgileri != null) 为空。
  • 是的,我想使用 Elemets()。你能帮忙运行这段代码吗?
  • @Abdulyar 验证命名空间是否正确,并且它们在 XML 中正确指定。帖子中提到了两个命名空间。 (我怀疑显示的 XML 片段不是文档的根元素...?Element/Elements 只查看直接子元素。考虑使用XPathSelectElements 进行更高级的查询。)
  • 如果您不介意,可以在在线信使中与您交谈吗?
  • @Abdulyar 不喜欢,抱歉。随意使用任何相关信息(例如完整的 XML)更新帖子,我可以从那里更新我的答案。如果这确实是根元素,它看起来好像缺少一个 xmlns:my=....
猜你喜欢
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多