我是 C# 新手,刚开始使用 XmlElement 及其 SelectSingleNode 方法。在我的 XML 文件中,有一个标签可能有值(即 <tag>value</tag> )或为空(即 <tag></tag> )。如果它为空,则 SelectSingleNode 返回 null。
我目前正在使用以下代码来捕获标签的值:
XmlElement elem = ....
string s = elem.SelectSingleNode("somepath").Value;
这段代码显然会引发空标签的异常。但是,对我来说,空标签是一个有效值,我希望我的字符串的值为“”。
用 try...catch 包装对 SelectSingleNode 的每次调用似乎是一种代码的巨大浪费(我有很多字段可能是空的),我相信有更好的方法来实现这一点。
推荐的方法是什么?
编辑:
根据请求,示例 XML 代码将是:
<Elements>
<Element>
<Name>Value</Name>
<Type>Value</Type> <-- may be empty
<Color>Value</Color>
</Element>
<Element>
<Name>Value</Name>
<Type>Value</Type>
<Color>Value</Color>
</Element>
</Elements>
CS代码:
XmlDocument doc = new XmlDocument();
doc.Load("name.xml");
foreach (XmlElement elem in doc.SelectNodes("Elements/Element"))
{
myvalue = elem.SelectSingleNode("Type/text()").Value;
}
最佳答案
您的示例代码:
myvalue = elem.SelectSingleNode("Type/text()").Value;
就是问题所在。您在那里使用的 XPath 表达式并不意味着“给我元素 Type 的文本”。它的意思是“给我元素类型的所有子文本节点”。并且空元素没有任何子文本节点(XPath 文档模型中的文本节点不能为空)。如果你想获取节点的文本值,你应该使用:
myvalue = elem.SelectSingleNode("Type").InnerText;
关于C# XmlElement : SelectSingleNode returns null for empty string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173177/
是否有一个等效的属性可以放置在.NET类中的对象属性上,以执行与XmlElement或XmlAttribute等效的操作?[XmlRoot("objects")]publicclassMyObjects:List{}[XmlRoot("object")]publicclassMyObject{[XmlAttribute("name")]publicstringName{get;set;}[XmlAttribute("title")]publicstringTitle{get;set;}}这将返回类似于以下内容的XML:我想要JavaScriptSerializer,由Controlle
使用Oracle10gR2,我需要从存储在标准关系表中的数据生成类似于以下伪示例的内容。p11005055问题是,我需要使用包含数据的行进行决策。我的数据库(我继承的)设计不佳,决定包含行所需的逻辑很复杂。不幸的是,重新设计数据库不是一种选择。我在这里大大简化了逻辑,因此不能使用简单的连接或where子句。数据和数据格式定义具有复杂的层次结构。在伪代码中,过于简化的决定看起来像这样:BEGIN--selectourbasicattributesselectXMLEMENT("product",XMLELEMENT("productName",name),XMLELEMENT("prod
我有以下类(class):[XmlElement("email-address")]publicclassEmailAddress{publicstringaddress{get;set;}publicstringlocation{get;set;}}XmlElement属性在这里有效,但我确实想要这种行为-这可能吗?要将此类的名称在XML中序列化为email-address而不是EmailAddress? 最佳答案 我认为您正在寻找XmlTypeAttribute如果您想更改类的序列化方式。
我想将集合编码为嵌套属性。现在我有:@XmlElement(name="entry")publicCollectiongetSizes(){...}返回:12但我想得到:如果没有新类,这可能吗? 最佳答案 如果没有新类(class),似乎是不可能的。使用XmlAdapter:classEntryAdapterextendsXmlAdapter{publicEntryAdapter.Entrymarshal(Integerid){returnnewEntry(id);}publicIntegerunmarshal(Entrye){re
我有一个以下格式的XML文件:...如果我在Powershell中获取该数据,我可以使用Get-Memeber查看数据的所有子元素:>$xmlData=[xml](Get-Contentmyfile.xml)>$xmlData.data|Get-Member...fooPropertySystem.Xml.XmlElement...barPropertySystem.Xml.XmlElement...tribblePropertySystem.Xml.XmlElement......而且我可以单独访问每个子元素。但是我如何遍历所有子项,用管道处理它们呢?我很想能够写出这样的东西:>$x
我正在创建几个用于更大XML文档的XmlElement。XmlElementthisElement=xmlSearchParameters.CreateElement("value");thisElement.InnerXml=this.searchParameters[key];这适用于大多数情况,但如果searchParameters[key]的值恰好包含&符号,我会得到以下两个错误之一:发生了意外的文件结束。第1行,位置1。-如果值为ONLY&解析EntityName时出错。第1行,位置7。-如果值包含&与其他文本混合。在XmlElement中包含&和任何其他特殊符号的首选方法是
我从WCf方法返回一个xmlElement。当我在客户端执行服务引用时,相同的方法返回XElement而不是XmlElement。我尝试了所有方法:更新服务引用、制作新的服务引用,但没有帮助。这是我的客户:ServiceReference1.BasicServiceClientbasicWCfClient=newServiceReference1.BasicServiceClient();XmlElementxmlelement=basicWCfClient.GetData(5);basicWCfClient.Close();我得到一个错误:“无法将类型‘System.Xml.Linq
我有一个具有以下数据的已定义类publicpartialclassEHRNodesTesting{privatestringfieldID;privateboolfieldRights;privatestringfieldName;[System.Xml.Serialization.XmlAttribute]publicstringFieldID{get{returnthis.fieldID;}set{this.fieldID=value;}}[System.Xml.Serialization.XmlAttribute]publicboolFieldRights{get{returnt
我的UTF-8格式的postgres数据库和UTF-8格式的客户端。当我尝试:selectxmlelement(namepampam,xmlattributes('русский'as"top"));我回来了:`但我想按原样(即俄语UTF-8)取回属性,而不是р....我该怎么做?这不是解决问题的方法,我使用xmleliment从查询返回的数据中构建xml。而且我找不到另一种方法来做到这一点... 最佳答案 这似乎是不可能的。要打印的值被传递给libxml,这就是它选择打印它的方式。
我的问题是,在进行JSON响应时,是否有必要在pojo中的每个元素之前添加@XmlElement以供jaxb获取。我正在使用jersey-json1.17。我问这个的原因是因为,theexamplegivenonJerseysite不使用注解。我得到一个作为{}的输出,但是当我在属性前添加@XmlElement时,我得到了预期的JSON输出。我是不是做错了什么,导致我的JSON字符串为空?我的代码:顶点列表在构造函数中填充。这会产生{}的错误输出@XmlRootElementpublicclassSquareModel{Listvertices=newArrayList();....}